Skip to content

Commit 60b0175

Browse files
authored
Bugfix: Set aggregateRoot property in newly generated aggregates (AR 'Split Aggregate by Entities') (#61)
1 parent 7c39604 commit 60b0175

File tree

6 files changed

+60
-7
lines changed

6 files changed

+60
-7
lines changed

org.contextmapper.dsl.tests/src/org/contextmapper/dsl/tests/generators/refactoring/henshin/SplitAggregateByEntitiesTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import org.contextmapper.dsl.contextMappingDSL.Module;
1414
import org.contextmapper.dsl.refactoring.henshin.SplitAggregateByEntitiesRefactoring;
1515
import org.contextmapper.dsl.tests.generators.refactoring.AbstractRefactoringTest;
16+
import org.contextmapper.tactic.dsl.tacticdsl.DomainObject;
17+
import org.contextmapper.tactic.dsl.tacticdsl.SimpleDomainObject;
1618
import org.eclipse.emf.ecore.resource.Resource;
1719
import org.eclipse.xtext.xbase.lib.IteratorExtensions;
1820
import org.junit.jupiter.api.Test;
@@ -44,6 +46,12 @@ void canSplitWithTwoAggregates() throws IOException {
4446
List<String> aggregateNames = bc.getAggregates().stream().map(a -> a.getName()).collect(Collectors.toList());
4547
assertTrue(aggregateNames.contains("Customers"));
4648
assertTrue(aggregateNames.contains("NewAggregate1"));
49+
50+
for (Aggregate aggregate : bc.getAggregates()) {
51+
SimpleDomainObject obj = aggregate.getDomainObjects().get(0);
52+
if (obj instanceof DomainObject)
53+
assertTrue(((DomainObject) obj).isAggregateRoot());
54+
}
4755
}
4856

4957
@Test
@@ -79,9 +87,9 @@ void canSplitInModule() throws IOException {
7987
List<ContextMappingModel> contextMappingModels = IteratorExtensions
8088
.<ContextMappingModel>toList(Iterators.<ContextMappingModel>filter(reloadResource(input).getAllContents(), ContextMappingModel.class));
8189
BoundedContext bc = contextMappingModels.get(0).getBoundedContexts().get(0);
82-
90+
8391
Module testModule = bc.getModules().get(0);
84-
92+
8593
assertEquals(2, testModule.getAggregates().size());
8694

8795
for (Aggregate aggregate : testModule.getAggregates()) {

org.contextmapper.dsl.ui/src/org/contextmapper/dsl/ui/handler/wizard/pages/AggregateSelectionWizardPage.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.eclipse.swt.events.KeyEvent;
2525
import org.eclipse.swt.layout.GridData;
2626
import org.eclipse.swt.layout.GridLayout;
27+
import org.eclipse.swt.program.Program;
2728
import org.eclipse.swt.widgets.Composite;
2829
import org.eclipse.swt.widgets.Event;
2930
import org.eclipse.swt.widgets.Label;
@@ -127,4 +128,9 @@ public List<String> getSelectedAggregates() {
127128
public boolean isPageComplete() {
128129
return boundedContextName.getText() != null && !"".equals(boundedContextName.getText()) && getSelectedAggregates().size() >= 1;
129130
}
131+
132+
@Override
133+
public void performHelp() {
134+
Program.launch("https://contextmapper.github.io/docs/ar-extract-aggregates-by-nfr/");
135+
}
130136
}

org.contextmapper.dsl.ui/src/org/contextmapper/dsl/ui/handler/wizard/pages/ContextMapperWizardPage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public Image getImage() {
1818

1919
@Override
2020
public void performHelp() {
21-
Program.launch("https://contextmapper.github.io/docs");
21+
Program.launch("https://contextmapper.github.io/docs/architectural-refactorings/");
2222
}
2323

2424
}

org.contextmapper.dsl.ui/src/org/contextmapper/dsl/ui/handler/wizard/pages/TwoBoundedContextSelectionWizardPage.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.eclipse.swt.events.SelectionEvent;
2727
import org.eclipse.swt.layout.GridData;
2828
import org.eclipse.swt.layout.GridLayout;
29+
import org.eclipse.swt.program.Program;
2930
import org.eclipse.swt.widgets.Combo;
3031
import org.eclipse.swt.widgets.Composite;
3132
import org.eclipse.swt.widgets.Label;
@@ -110,7 +111,7 @@ public void keyReleased(KeyEvent e) {
110111
setControl(container);
111112
setPageComplete(false);
112113
}
113-
114+
114115
@Override
115116
public void setVisible(boolean visible) {
116117
super.setVisible(visible);
@@ -129,4 +130,9 @@ public String getBoundedContext2() {
129130
public boolean isPageComplete() {
130131
return this.allBoundedContexts.contains(comboBC1.getText()) && this.allBoundedContexts.contains(comboBC2.getText()) && !comboBC1.getText().equals(comboBC2.getText());
131132
}
133+
134+
@Override
135+
public void performHelp() {
136+
Program.launch("https://contextmapper.github.io/docs/ar-merge-bounded-contexts/");
137+
}
132138
}

org.contextmapper.dsl/src/org/contextmapper/dsl/refactoring/henshin/SplitAggregateByEntitiesRefactoring.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.contextmapper.dsl.contextMappingDSL.BoundedContext;
2323
import org.contextmapper.dsl.contextMappingDSL.ContextMappingModel;
2424
import org.contextmapper.dsl.contextMappingDSL.Module;
25+
import org.contextmapper.tactic.dsl.tacticdsl.DomainObject;
26+
import org.contextmapper.tactic.dsl.tacticdsl.SimpleDomainObject;
2527
import org.eclipse.emf.ecore.resource.Resource;
2628
import org.eclipse.emf.henshin.interpreter.UnitApplication;
2729
import org.eclipse.xtext.EcoreUtil2;
@@ -72,26 +74,37 @@ protected void postProcessing(Resource resource) {
7274
Aggregate inputAggregate = getSelectedAggregate(contextMappingModels.get(0));
7375
if (inputAggregate == null)
7476
return;
77+
setAggregateRoot(inputAggregate);
7578
if (inputAggregate.eContainer() instanceof BoundedContext) {
7679
BoundedContext bc = (BoundedContext) inputAggregate.eContainer();
77-
fixNewAggregateNames(bc.getAggregates());
80+
fixNewAggregateNamesAndSetRoot(bc.getAggregates());
7881
} else if (inputAggregate.eContainer() instanceof Module) {
7982
Module m = (Module) inputAggregate.eContainer();
80-
fixNewAggregateNames(m.getAggregates());
83+
fixNewAggregateNamesAndSetRoot(m.getAggregates());
8184
}
8285
}
8386

8487
}
8588

86-
private void fixNewAggregateNames(List<Aggregate> aggregates) {
89+
private void fixNewAggregateNamesAndSetRoot(List<Aggregate> aggregates) {
8790
List<Aggregate> newAggregates = aggregates.stream().filter(agg -> agg.getName().equals(TEMP_AGGREGATE_NAMES)).collect(Collectors.toList());
8891
int i = 1;
8992
for (Aggregate newAggregate : newAggregates) {
9093
newAggregate.setName(NEW_AGGREGATE_NAME_PREFIX + i);
94+
setAggregateRoot(newAggregate);
9195
i++;
9296
}
9397
}
9498

99+
private void setAggregateRoot(Aggregate aggregate) {
100+
// after this refactoring, there should only be one entity per aggregate
101+
if (aggregate.getDomainObjects().size() == 1) {
102+
SimpleDomainObject object = aggregate.getDomainObjects().get(0);
103+
if (object instanceof DomainObject)
104+
((DomainObject) object).setAggregateRoot(true);
105+
}
106+
}
107+
95108
private Aggregate getSelectedAggregate(ContextMappingModel model) {
96109
List<Aggregate> allAggregates = EcoreUtil2.<Aggregate>getAllContentsOfType(model, Aggregate.class);
97110
List<Aggregate> aggregatesWithInputName = allAggregates.stream().filter(agg -> agg.getName().equals(aggregateName)).collect(Collectors.toList());

org.contextmapper.dsl/src/org/contextmapper/tactic/dsl/formatting2/TacticDDDLanguageFormatter.xtend

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package org.contextmapper.tactic.dsl.formatting2
1717

1818
import com.google.inject.Inject
1919
import org.contextmapper.tactic.dsl.services.TacticDDDLanguageGrammarAccess
20+
import org.contextmapper.tactic.dsl.tacticdsl.DomainEvent
2021
import org.contextmapper.tactic.dsl.tacticdsl.Entity
2122
import org.contextmapper.tactic.dsl.tacticdsl.TacticDDDModel
2223
import org.eclipse.xtext.formatting2.AbstractFormatter2
@@ -39,6 +40,8 @@ class TacticDDDLanguageFormatter extends AbstractFormatter2 {
3940
entity.regionFor.keyword('}').prepend[newLine].append[newLine]
4041
)[indent]
4142

43+
entity.regionFor.keyword('aggregateRoot').append[newLine]
44+
4245
for (attribute : entity.attributes) {
4346
attribute.format
4447
attribute.append[newLine]
@@ -47,5 +50,22 @@ class TacticDDDLanguageFormatter extends AbstractFormatter2 {
4750
reference.format
4851
}
4952
}
53+
54+
def dispatch void format(DomainEvent domainEvent, extension IFormattableDocument document) {
55+
interior(
56+
domainEvent.regionFor.keyword('{').append[newLine],
57+
domainEvent.regionFor.keyword('}').prepend[newLine].append[newLine]
58+
)[indent]
59+
60+
domainEvent.regionFor.keyword('aggregateRoot').append[newLine]
61+
62+
for (attribute : domainEvent.attributes) {
63+
attribute.format
64+
attribute.append[newLine]
65+
}
66+
for (reference : domainEvent.references) {
67+
reference.format
68+
}
69+
}
5070

5171
}

0 commit comments

Comments
 (0)