Skip to content
This repository was archived by the owner on Mar 28, 2026. It is now read-only.

Commit 1e6c2a3

Browse files
Closes #347.
1 parent b507b5d commit 1e6c2a3

4 files changed

Lines changed: 74 additions & 1 deletion

File tree

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- structurizr-dsl: Adds a way to configure whether the DSL source is retained via a workspace property named `structurizr.dsl.source` - `true` (default) or `false`.
1313
- structurizr-dsl: Adds the ability to define a PlantUML/Mermaid image view that is an export of a workspace view.
1414
- structurizr-dsl: Adds support for `url`, `properties`, and `perspectives` nested inside `!elements` and `!relationships`.
15+
- structurizr-dsl: Fixes https://github.com/structurizr/java/issues/347 (`->container->` expression does not work as expected in deployment view).
1516

1617
## 3.0.0 (19th September 2024)
1718

structurizr-dsl/src/main/java/com/structurizr/dsl/DeploymentViewExpressionParser.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import java.util.LinkedHashSet;
66
import java.util.Set;
7+
import java.util.stream.Collectors;
78

89
import static com.structurizr.dsl.StructurizrDslExpressions.ELEMENT_TYPE_EQUALS_EXPRESSION;
910

@@ -43,6 +44,24 @@ protected Set<Element> evaluateElementTypeExpression(String expr, DslContext con
4344
return elements;
4445
}
4546

47+
@Override
48+
protected Set<Element> getElements(String identifier, DslContext context) {
49+
Set<Element> elements = new LinkedHashSet<>();
50+
for (Element element : super.getElements(identifier, context)) {
51+
if (element instanceof SoftwareSystem) {
52+
Set<SoftwareSystemInstance> elementInstances = context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof SoftwareSystemInstance).map(e -> (SoftwareSystemInstance) e).filter(ssi -> ssi.getSoftwareSystem().equals(element)).collect(Collectors.toSet());
53+
elements.addAll(elementInstances);
54+
} else if (element instanceof Container) {
55+
Set<ContainerInstance> elementInstances = context.getWorkspace().getModel().getElements().stream().filter(e -> e instanceof ContainerInstance).map(e -> (ContainerInstance)e).filter(ci -> ci.getContainer().equals(element)).collect(Collectors.toSet());
56+
elements.addAll(elementInstances);
57+
} else {
58+
elements.add(element);
59+
}
60+
}
61+
62+
return elements;
63+
}
64+
4665
protected Set<Element> findAfferentCouplings(Element element) {
4766
Set<Element> elements = new LinkedHashSet<>();
4867

structurizr-dsl/src/main/java/com/structurizr/dsl/ExpressionParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ protected Set<ModelItem> parseIdentifier(String identifier, DslContext context)
419419
}
420420
}
421421

422-
private Set<Element> getElements(String identifier, DslContext context) {
422+
protected Set<Element> getElements(String identifier, DslContext context) {
423423
Set<Element> elements = new HashSet<>();
424424

425425
Element element = context.getElement(identifier);

structurizr-dsl/src/test/java/com/structurizr/dsl/DeploymentViewExpressionParserTests.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,4 +217,57 @@ void test_parseExpression_ReturnsElements_WhenBooleanOrUsed() {
217217
assertTrue(elements.contains(containerInstance));
218218
}
219219

220+
@Test
221+
void test_parseExpression_ReturnsSoftwareSystemInstanceDependencies_WhenASoftwareSystemExpressionIsUsed() {
222+
SoftwareSystem a = model.addSoftwareSystem("A");
223+
SoftwareSystem b = model.addSoftwareSystem("B");
224+
a.uses(b, "");
225+
226+
DeploymentNode deploymentNode = model.addDeploymentNode("Live", "Deployment Node", "Description", "Technology");
227+
InfrastructureNode infrastructureNode = deploymentNode.addInfrastructureNode("Infrastructure Node");
228+
SoftwareSystemInstance softwareSystemInstanceA = deploymentNode.add(a);
229+
SoftwareSystemInstance softwareSystemInstanceB = deploymentNode.add(b);
230+
infrastructureNode.uses(softwareSystemInstanceA, "", "");
231+
232+
DeploymentViewDslContext context = new DeploymentViewDslContext(null);
233+
context.setWorkspace(workspace);
234+
235+
IdentifiersRegister identifiersRegister = new IdentifiersRegister();
236+
identifiersRegister.register("a", a);
237+
context.setIdentifierRegister(identifiersRegister);
238+
239+
Set<ModelItem> elements = parser.parseExpression("->a->", context);
240+
assertEquals(3, elements.size());
241+
assertTrue(elements.contains(infrastructureNode));
242+
assertTrue(elements.contains(softwareSystemInstanceA));
243+
assertTrue(elements.contains(softwareSystemInstanceB));
244+
}
245+
246+
@Test
247+
void test_parseExpression_ReturnsContainerInstanceDependencies_WhenAContainerExpressionIsUsed() {
248+
SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System");
249+
Container container1 = softwareSystem.addContainer("Container 1");
250+
Container container2 = softwareSystem.addContainer("Container 2");
251+
container1.uses(container2, "");
252+
253+
DeploymentNode deploymentNode = model.addDeploymentNode("Live", "Deployment Node", "Description", "Technology");
254+
InfrastructureNode infrastructureNode = deploymentNode.addInfrastructureNode("Infrastructure Node");
255+
ContainerInstance containerInstance1 = deploymentNode.add(container1);
256+
ContainerInstance containerInstance2 = deploymentNode.add(container2);
257+
infrastructureNode.uses(containerInstance1, "", "");
258+
259+
DeploymentViewDslContext context = new DeploymentViewDslContext(null);
260+
context.setWorkspace(workspace);
261+
262+
IdentifiersRegister identifiersRegister = new IdentifiersRegister();
263+
identifiersRegister.register("c1", container1);
264+
context.setIdentifierRegister(identifiersRegister);
265+
266+
Set<ModelItem> elements = parser.parseExpression("->c1->", context);
267+
assertEquals(3, elements.size());
268+
assertTrue(elements.contains(infrastructureNode));
269+
assertTrue(elements.contains(containerInstance1));
270+
assertTrue(elements.contains(containerInstance2));
271+
}
272+
220273
}

0 commit comments

Comments
 (0)