Skip to content

Commit 0e14d60

Browse files
Fixes #404.
1 parent 7d28dd5 commit 0e14d60

14 files changed

+210
-54
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
- structurizr-dsl: Adds support for setting the symbols surrounding element/relationship metadata used when rendering diagrams.
1111
- structurizr-dsl: Fixes https://github.com/structurizr/java/issues/408 (Animation steps cannot be added to deployment views via static structure element references).
1212
- structurizr-dsl: Adds support for specifying view animation steps via element expressions.
13+
- structurizr-dsl: Fixes https://github.com/structurizr/java/issues/404 (deploymentGroup does not obey !identifiers hierarchical).
1314
- structurizr-export: Adds support for rank and node separation to the StructurizrPlantUMLExporter.
1415

1516
## v4.0.0 (28th March 2025)

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

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.structurizr.dsl;
22

3-
import com.structurizr.model.*;
3+
import com.structurizr.model.Container;
4+
import com.structurizr.model.ContainerInstance;
5+
import com.structurizr.model.DeploymentNode;
6+
import com.structurizr.model.Element;
47

58
import java.util.HashSet;
69
import java.util.Set;
710

8-
final class ContainerInstanceParser extends AbstractParser {
11+
final class ContainerInstanceParser extends StaticStructureInstanceParser {
912

1013
private static final String GRAMMAR = "containerInstance <identifier> [deploymentGroups] [tags]";
1114

@@ -35,15 +38,7 @@ ContainerInstance parse(DeploymentNodeDslContext context, Tokens tokens) {
3538

3639
Set<String> deploymentGroups = new HashSet<>();
3740
if (tokens.includes(DEPLOYMENT_GROUPS_TOKEN)) {
38-
String token = tokens.get(DEPLOYMENT_GROUPS_TOKEN);
39-
40-
String[] deploymentGroupReferences = token.split(",");
41-
for (String deploymentGroupReference : deploymentGroupReferences) {
42-
Element e = context.getElement(deploymentGroupReference);
43-
if (e instanceof DeploymentGroup) {
44-
deploymentGroups.add(e.getName());
45-
}
46-
}
41+
deploymentGroups = getDeploymentGroups(context, tokens.get(DEPLOYMENT_GROUPS_TOKEN));
4742
}
4843

4944
ContainerInstance containerInstance = deploymentNode.add((Container)element, deploymentGroups.toArray(new String[]{}));

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22

33
final class DeploymentEnvironmentDslContext extends DslContext implements GroupableDslContext {
44

5-
private final String environment;
5+
private final DeploymentEnvironment environment;
66
private final ElementGroup group;
77

88
DeploymentEnvironmentDslContext(String environment) {
9-
this.environment = environment;
9+
this.environment = new DeploymentEnvironment(environment);
1010
this.group = null;
1111
}
1212

1313
DeploymentEnvironmentDslContext(String environment, ElementGroup group) {
14-
this.environment = environment;
14+
this.environment = new DeploymentEnvironment(environment);
1515
this.group = group;
1616
}
1717

18-
String getEnvironment() {
18+
DeploymentEnvironment getEnvironment() {
1919
return environment;
2020
}
2121

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66

77
class DeploymentGroup extends Element {
88

9-
private String name;
9+
private final Element parent;
10+
private final String name;
1011

11-
DeploymentGroup(String name) {
12+
DeploymentGroup(DeploymentEnvironment deploymentEnvironment, String name) {
13+
this.parent = deploymentEnvironment;
1214
this.name = name;
1315
}
1416

@@ -24,7 +26,7 @@ public String getCanonicalName() {
2426

2527
@Override
2628
public Element getParent() {
27-
return null;
29+
return parent;
2830
}
2931

3032
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ DeploymentNode parse(DeploymentEnvironmentDslContext deploymentEnvironmentDslCon
5151

5252
if (deploymentEnvironmentDslContext != null) {
5353
// add a root deployment node
54-
deploymentNode = deploymentEnvironmentDslContext.getWorkspace().getModel().addDeploymentNode(deploymentEnvironmentDslContext.getEnvironment(), name, description, technology);
54+
deploymentNode = deploymentEnvironmentDslContext.getWorkspace().getModel().addDeploymentNode(deploymentEnvironmentDslContext.getEnvironment().getName(), name, description, technology);
5555

5656
if (deploymentEnvironmentDslContext.hasGroup()) {
5757
deploymentNode.setGroup(deploymentEnvironmentDslContext.getGroup().getName());

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ void setIdentifierRegister(IdentifiersRegister identifersRegister) {
4040
this.identifiersRegister = identifersRegister;
4141
}
4242

43+
String findIdentifier(Element element) {
44+
return identifiersRegister.findIdentifier(element);
45+
}
46+
4347
Element getElement(String identifier) {
4448
return getElement(identifier, null);
4549
}
@@ -71,7 +75,7 @@ Element getElement(String identifier, Class<? extends Element> type) {
7175
}
7276
} else if (this instanceof DeploymentEnvironmentDslContext) {
7377
DeploymentEnvironmentDslContext deploymentEnvironmentDslContext = (DeploymentEnvironmentDslContext)this;
74-
DeploymentEnvironment deploymentEnvironment = new DeploymentEnvironment(deploymentEnvironmentDslContext.getEnvironment());
78+
DeploymentEnvironment deploymentEnvironment = deploymentEnvironmentDslContext.getEnvironment();
7579
String parentIdentifier = identifiersRegister.findIdentifier(deploymentEnvironment);
7680

7781
element = identifiersRegister.getElement(parentIdentifier + "." + identifier);

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

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.structurizr.dsl;
22

3-
import com.structurizr.model.*;
3+
import com.structurizr.model.DeploymentNode;
4+
import com.structurizr.model.Element;
5+
import com.structurizr.model.SoftwareSystem;
6+
import com.structurizr.model.SoftwareSystemInstance;
47

58
import java.util.HashSet;
69
import java.util.Set;
710

8-
final class SoftwareSystemInstanceParser extends AbstractParser {
11+
final class SoftwareSystemInstanceParser extends StaticStructureInstanceParser {
912

1013
private static final String GRAMMAR = "softwareSystemInstance <identifier> [deploymentGroups] [tags]";
1114

@@ -36,15 +39,7 @@ SoftwareSystemInstance parse(DeploymentNodeDslContext context, Tokens tokens) {
3639

3740
Set<String> deploymentGroups = new HashSet<>();
3841
if (tokens.includes(DEPLOYMENT_GROUPS_TOKEN)) {
39-
String token = tokens.get(DEPLOYMENT_GROUPS_TOKEN);
40-
41-
String[] deploymentGroupReferences = token.split(",");
42-
for (String deploymentGroupReference : deploymentGroupReferences) {
43-
Element e = context.getElement(deploymentGroupReference);
44-
if (e instanceof DeploymentGroup) {
45-
deploymentGroups.add(e.getName());
46-
}
47-
}
42+
deploymentGroups = getDeploymentGroups(context, tokens.get(DEPLOYMENT_GROUPS_TOKEN));
4843
}
4944

5045
SoftwareSystemInstance softwareSystemInstance = deploymentNode.add((SoftwareSystem)element, deploymentGroups.toArray(new String[]{}));
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.structurizr.dsl;
2+
3+
import com.structurizr.model.Element;
4+
5+
import java.util.HashSet;
6+
import java.util.Set;
7+
8+
abstract class StaticStructureInstanceParser extends AbstractParser {
9+
10+
protected Set<String> getDeploymentGroups(DeploymentNodeDslContext context, String token) {
11+
Set<String> deploymentGroups = new HashSet<>();
12+
String[] deploymentGroupReferences = token.split(",");
13+
for (String deploymentGroupReference : deploymentGroupReferences) {
14+
Element e = context.getElement(deploymentGroupReference, DeploymentGroup.class);
15+
16+
if (e == null) {
17+
// try to find deployment group via hierarchical identifier
18+
String deploymentEnvironmentName = context.getDeploymentNode().getEnvironment();
19+
String deploymentEnvironmentIdentifier = context.findIdentifier(new DeploymentEnvironment(deploymentEnvironmentName));
20+
21+
e = context.getElement(deploymentEnvironmentIdentifier + "." + deploymentGroupReference, DeploymentGroup.class);
22+
}
23+
24+
if (e instanceof DeploymentGroup) {
25+
deploymentGroups.add(e.getName());
26+
} else {
27+
// backwards compatibility - deployment environment name rather than identifier
28+
}
29+
}
30+
31+
return deploymentGroups;
32+
}
33+
34+
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -549,8 +549,8 @@ void parse(List<String> lines, File dslFile, boolean fragment, boolean includeIn
549549
} else if (isElementKeywordOrArchetype(firstToken, GROUP_TOKEN) && inContext(DeploymentEnvironmentDslContext.class)) {
550550
ElementGroup group = new GroupParser().parseContext(getContext(DeploymentEnvironmentDslContext.class), tokens);
551551

552-
String environment = getContext(DeploymentEnvironmentDslContext.class).getEnvironment();
553-
startContext(new DeploymentEnvironmentDslContext(environment, group));
552+
DeploymentEnvironment environment = getContext(DeploymentEnvironmentDslContext.class).getEnvironment();
553+
startContext(new DeploymentEnvironmentDslContext(environment.getName(), group));
554554
registerIdentifier(identifier, group);
555555
} else if (isElementKeywordOrArchetype(firstToken, GROUP_TOKEN) && inContext(DeploymentNodeDslContext.class)) {
556556
ElementGroup group = new GroupParser().parseContext(getContext(DeploymentNodeDslContext.class), tokens);
@@ -877,7 +877,7 @@ void parse(List<String> lines, File dslFile, boolean fragment, boolean includeIn
877877
} else if (DEPLOYMENT_GROUP_TOKEN.equalsIgnoreCase(firstToken) && inContext(DeploymentEnvironmentDslContext.class)) {
878878
String group = new DeploymentGroupParser().parse(tokens.withoutContextStartToken());
879879

880-
registerIdentifier(identifier, new DeploymentGroup(group));
880+
registerIdentifier(identifier, new DeploymentGroup(getContext(DeploymentEnvironmentDslContext.class).getEnvironment(), group));
881881

882882
} else if (isElementKeywordOrArchetype(firstToken, DEPLOYMENT_NODE_TOKEN) && inContext(DeploymentEnvironmentDslContext.class)) {
883883
Archetype archetype = getArchetype(DEPLOYMENT_NODE_TOKEN, firstToken);

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,13 @@ void test_parse_CreatesAContainerInstanceInTheSpecifiedDeploymentGroup() {
103103
SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System", "Description");
104104
Container container = softwareSystem.addContainer("Container", "Description", "Technology");
105105
DeploymentNode deploymentNode = model.addDeploymentNode("Live", "Deployment Node", "Description", "Technology");
106+
106107
DeploymentNodeDslContext context = new DeploymentNodeDslContext(deploymentNode);
108+
107109
IdentifiersRegister elements = new IdentifiersRegister();
108110
elements.register("container", container);
109-
elements.register("group", new DeploymentGroup("Group"));
111+
elements.register("live", new DeploymentEnvironment("Live"));
112+
elements.register("group", new DeploymentGroup(new DeploymentEnvironment("Live"), "Group"));
110113
context.setIdentifierRegister(elements);
111114

112115
parser.parse(context, tokens("containerInstance", "container", "group"));
@@ -126,10 +129,13 @@ void test_parse_CreatesAContainerInstanceInTheSpecifiedDeploymentGroupWithTags()
126129
SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System", "Description");
127130
Container container = softwareSystem.addContainer("Container", "Description", "Technology");
128131
DeploymentNode deploymentNode = model.addDeploymentNode("Live", "Deployment Node", "Description", "Technology");
132+
129133
DeploymentNodeDslContext context = new DeploymentNodeDslContext(deploymentNode);
134+
130135
IdentifiersRegister elements = new IdentifiersRegister();
131136
elements.register("container", container);
132-
elements.register("group", new DeploymentGroup("Group"));
137+
elements.register("live", new DeploymentEnvironment("Live"));
138+
elements.register("group", new DeploymentGroup(new DeploymentEnvironment("Live"), "Group"));
133139
context.setIdentifierRegister(elements);
134140

135141
parser.parse(context, tokens("containerInstance", "container", "group", "Tag 1, Tag 2"));

0 commit comments

Comments
 (0)