Skip to content

Commit 518da43

Browse files
Fixes #399.
1 parent c44696f commit 518da43

19 files changed

+287
-84
lines changed

changelog.md

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

55
- structurizr-dsl: Allows archetypes to be used via workspace extension.
66
- structurizr-dsl: Adds archetype support for custom elements.
7+
- structurizr-dsl: Fixes https://github.com/structurizr/java/issues/399 (Archetype tags sometimes missing).
78
- structurizr-dsl: Fixes https://github.com/structurizr/java/issues/392 (SVG not supported in base 64 encoding not mentioned in documentation).
89
- structurizr-dsl: Adds support for setting the symbols surrounding element/relationship metadata used when rendering diagrams.
910
- structurizr-export: Adds support for rank and node separation to the StructurizrPlantUMLExporter.

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.structurizr.model.Component;
44
import com.structurizr.model.Container;
55

6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.List;
9+
610
final class ComponentParser extends AbstractParser {
711

812
private static final String GRAMMAR = "component <name> [description] [technology] [tags]";
@@ -47,11 +51,11 @@ Component parse(ContainerDslContext context, Tokens tokens, Archetype archetype)
4751
}
4852
component.setTechnology(technology);
4953

50-
String[] tags = archetype.getTags().toArray(new String[0]);
54+
List<String> tags = new ArrayList<>(archetype.getTags());
5155
if (tokens.includes(TAGS_INDEX)) {
52-
tags = tokens.get(TAGS_INDEX).split(",");
56+
tags.addAll(Arrays.asList(tokens.get(TAGS_INDEX).split(",")));
5357
}
54-
component.addTags(tags);
58+
component.addTags(tags.toArray(new String[0]));
5559

5660
component.addProperties(archetype.getProperties());
5761
component.addPerspectives(archetype.getPerspectives());

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.structurizr.model.Container;
44
import com.structurizr.model.SoftwareSystem;
55

6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.List;
9+
610
final class ContainerParser extends AbstractParser {
711

812
private static final String GRAMMAR = "container <name> [description] [technology] [tags]";
@@ -47,11 +51,11 @@ Container parse(SoftwareSystemDslContext context, Tokens tokens, Archetype arche
4751
}
4852
container.setTechnology(technology);
4953

50-
String[] tags = archetype.getTags().toArray(new String[0]);
54+
List<String> tags = new ArrayList<>(archetype.getTags());
5155
if (tokens.includes(TAGS_INDEX)) {
52-
tags = tokens.get(TAGS_INDEX).split(",");
56+
tags.addAll(Arrays.asList(tokens.get(TAGS_INDEX).split(",")));
5357
}
54-
container.addTags(tags);
58+
container.addTags(tags.toArray(new String[0]));
5559

5660
container.addProperties(archetype.getProperties());
5761
container.addPerspectives(archetype.getPerspectives());

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
import com.structurizr.model.Location;
55
import com.structurizr.model.Person;
66

7+
import java.util.ArrayList;
8+
import java.util.Arrays;
9+
import java.util.List;
10+
711
final class CustomElementParser extends AbstractParser {
812

913
private static final String GRAMMAR = "element <name> [metadata] [description] [tags]";
@@ -38,11 +42,11 @@ CustomElement parse(ModelDslContext context, Tokens tokens, Archetype archetype)
3842

3943
CustomElement customElement = context.getWorkspace().getModel().addCustomElement(name, metadata, description);
4044

41-
String[] tags = archetype.getTags().toArray(new String[0]);
45+
List<String> tags = new ArrayList<>(archetype.getTags());
4246
if (tokens.includes(TAGS_INDEX)) {
43-
tags = tokens.get(TAGS_INDEX).split(",");
47+
tags.addAll(Arrays.asList(tokens.get(TAGS_INDEX).split(",")));
4448
}
45-
customElement.addTags(tags);
49+
customElement.addTags(tags.toArray(new String[0]));
4650

4751
if (context.hasGroup()) {
4852
customElement.setGroup(context.getGroup().getName());

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

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

33
import com.structurizr.model.DeploymentNode;
4+
import com.structurizr.model.Model;
5+
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.List;
49

510
final class DeploymentNodeParser extends AbstractParser {
611

@@ -13,55 +18,14 @@ final class DeploymentNodeParser extends AbstractParser {
1318
private static final int INSTANCES_INDEX = 5;
1419

1520
DeploymentNode parse(DeploymentEnvironmentDslContext context, Tokens tokens, Archetype archetype) {
16-
// deploymentNode <name> [description] [technology] [tags] [instances]
17-
18-
if (tokens.hasMoreThan(INSTANCES_INDEX)) {
19-
throw new RuntimeException("Too many tokens, expected: " + GRAMMAR);
20-
}
21-
22-
if (!tokens.includes(NAME_INDEX)) {
23-
throw new RuntimeException("Expected: " + GRAMMAR);
24-
}
25-
26-
DeploymentNode deploymentNode = null;
27-
String name = tokens.get(NAME_INDEX);
28-
29-
String description = archetype.getDescription();
30-
if (tokens.includes(DESCRIPTION_INDEX)) {
31-
description = tokens.get(DESCRIPTION_INDEX);
32-
}
33-
34-
String technology = archetype.getTechnology();
35-
if (tokens.includes(TECHNOLOGY_INDEX)) {
36-
technology = tokens.get(TECHNOLOGY_INDEX);
37-
}
38-
39-
deploymentNode = context.getWorkspace().getModel().addDeploymentNode(context.getEnvironment(), name, description, technology);
40-
41-
String[] tags = archetype.getTags().toArray(new String[0]);
42-
if (tokens.includes(TAGS_INDEX)) {
43-
tags = tokens.get(TAGS_INDEX).split(",");
44-
}
45-
deploymentNode.addTags(tags);
46-
47-
deploymentNode.addProperties(archetype.getProperties());
48-
deploymentNode.addPerspectives(archetype.getPerspectives());
49-
50-
String instances = "1";
51-
if (tokens.includes(INSTANCES_INDEX)) {
52-
instances = tokens.get(INSTANCES_INDEX);
53-
deploymentNode.setInstances(instances);
54-
}
55-
56-
if (context.hasGroup()) {
57-
deploymentNode.setGroup(context.getGroup().getName());
58-
context.getGroup().addElement(deploymentNode);
59-
}
60-
61-
return deploymentNode;
21+
return parse(context, null, tokens, archetype);
6222
}
6323

6424
DeploymentNode parse(DeploymentNodeDslContext context, Tokens tokens, Archetype archetype) {
25+
return parse(null, context, tokens, archetype);
26+
}
27+
28+
DeploymentNode parse(DeploymentEnvironmentDslContext deploymentEnvironmentDslContext, DeploymentNodeDslContext deploymentNodeDslContext, Tokens tokens, Archetype archetype) {
6529
// deploymentNode <name> [description] [technology] [tags] [instances]
6630

6731
if (tokens.hasMoreThan(INSTANCES_INDEX)) {
@@ -85,14 +49,28 @@ DeploymentNode parse(DeploymentNodeDslContext context, Tokens tokens, Archetype
8549
technology = tokens.get(TECHNOLOGY_INDEX);
8650
}
8751

88-
DeploymentNode parent = context.getDeploymentNode();
89-
deploymentNode = parent.addDeploymentNode(name, description, technology);
52+
if (deploymentEnvironmentDslContext != null) {
53+
// add a root deployment node
54+
deploymentNode = deploymentEnvironmentDslContext.getWorkspace().getModel().addDeploymentNode(deploymentEnvironmentDslContext.getEnvironment(), name, description, technology);
9055

91-
String[] tags = archetype.getTags().toArray(new String[0]);
56+
if (deploymentEnvironmentDslContext.hasGroup()) {
57+
deploymentNode.setGroup(deploymentEnvironmentDslContext.getGroup().getName());
58+
deploymentEnvironmentDslContext.getGroup().addElement(deploymentNode);
59+
}
60+
} else {
61+
deploymentNode = deploymentNodeDslContext.getDeploymentNode().addDeploymentNode(name, description, technology);
62+
63+
if (deploymentNodeDslContext.hasGroup()) {
64+
deploymentNode.setGroup(deploymentNodeDslContext.getGroup().getName());
65+
deploymentNodeDslContext.getGroup().addElement(deploymentNode);
66+
}
67+
}
68+
69+
List<String> tags = new ArrayList<>(archetype.getTags());
9270
if (tokens.includes(TAGS_INDEX)) {
93-
tags = tokens.get(TAGS_INDEX).split(",");
71+
tags.addAll(Arrays.asList(tokens.get(TAGS_INDEX).split(",")));
9472
}
95-
deploymentNode.addTags(tags);
73+
deploymentNode.addTags(tags.toArray(new String[0]));
9674

9775
deploymentNode.addProperties(archetype.getProperties());
9876
deploymentNode.addPerspectives(archetype.getPerspectives());
@@ -103,11 +81,6 @@ DeploymentNode parse(DeploymentNodeDslContext context, Tokens tokens, Archetype
10381
deploymentNode.setInstances(instances);
10482
}
10583

106-
if (context.hasGroup()) {
107-
deploymentNode.setGroup(context.getGroup().getName());
108-
context.getGroup().addElement(deploymentNode);
109-
}
110-
11184
return deploymentNode;
11285
}
11386

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import com.structurizr.model.Relationship;
55

66
import javax.lang.model.util.Elements;
7-
import java.util.LinkedHashSet;
8-
import java.util.Set;
7+
import java.util.*;
98

109
final class ExplicitRelationshipParser extends AbstractRelationshipParser {
1110

@@ -50,12 +49,12 @@ Relationship parse(DslContext context, Tokens tokens, Archetype archetype) {
5049
technology = tokens.get(TECHNOLOGY_INDEX);
5150
}
5251

53-
String[] tags = archetype.getTags().toArray(new String[0]);
52+
List<String> tags = new ArrayList<>(archetype.getTags());
5453
if (tokens.includes(TAGS_INDEX)) {
55-
tags = tokens.get(TAGS_INDEX).split(",");
54+
tags.addAll(Arrays.asList(tokens.get(TAGS_INDEX).split(",")));
5655
}
5756

58-
Relationship relationship = createRelationship(sourceElement, description, technology, tags, destinationElement);
57+
Relationship relationship = createRelationship(sourceElement, description, technology, tags.toArray(new String[0]), destinationElement);
5958
relationship.addProperties(archetype.getProperties());
6059
relationship.addPerspectives(archetype.getPerspectives());
6160

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import com.structurizr.model.Element;
44
import com.structurizr.model.Relationship;
55

6-
import java.util.LinkedHashSet;
7-
import java.util.Set;
6+
import java.util.*;
87

98
final class ImplicitRelationshipParser extends AbstractRelationshipParser {
109

@@ -45,12 +44,12 @@ Relationship parse(ElementDslContext context, Tokens tokens, Archetype archetype
4544
technology = tokens.get(TECHNOLOGY_INDEX);
4645
}
4746

48-
String[] tags = archetype.getTags().toArray(new String[0]);
47+
List<String> tags = new ArrayList<>(archetype.getTags());
4948
if (tokens.includes(TAGS_INDEX)) {
50-
tags = tokens.get(TAGS_INDEX).split(",");
49+
tags.addAll(Arrays.asList(tokens.get(TAGS_INDEX).split(",")));
5150
}
5251

53-
Relationship relationship = createRelationship(sourceElement, description, technology, tags, destinationElement);
52+
Relationship relationship = createRelationship(sourceElement, description, technology, tags.toArray(new String[0]), destinationElement);
5453
relationship.addProperties(archetype.getProperties());
5554
relationship.addPerspectives(archetype.getPerspectives());
5655

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.structurizr.model.DeploymentNode;
44
import com.structurizr.model.InfrastructureNode;
55

6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.List;
9+
610
final class InfrastructureNodeParser extends AbstractParser {
711

812
private static final String GRAMMAR = "infrastructureNode <name> [description] [technology] [tags]";
@@ -39,11 +43,11 @@ InfrastructureNode parse(DeploymentNodeDslContext context, Tokens tokens, Archet
3943

4044
infrastructureNode = deploymentNode.addInfrastructureNode(name, description, technology);
4145

42-
String[] tags = archetype.getTags().toArray(new String[0]);
46+
List<String> tags = new ArrayList<>(archetype.getTags());
4347
if (tokens.includes(TAGS_INDEX)) {
44-
tags = tokens.get(TAGS_INDEX).split(",");
48+
tags.addAll(Arrays.asList(tokens.get(TAGS_INDEX).split(",")));
4549
}
46-
infrastructureNode.addTags(tags);
50+
infrastructureNode.addTags(tags.toArray(new String[0]));
4751

4852
infrastructureNode.addProperties(archetype.getProperties());
4953
infrastructureNode.addPerspectives(archetype.getPerspectives());

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import com.structurizr.model.Person;
44

5+
import java.util.ArrayList;
6+
import java.util.Arrays;
7+
import java.util.List;
8+
59
final class PersonParser extends AbstractParser {
610

711
private static final String GRAMMAR = "person <name> [description] [tags]";
@@ -38,11 +42,11 @@ Person parse(ModelDslContext context, Tokens tokens, Archetype archetype) {
3842
}
3943
person.setDescription(description);
4044

41-
String[] tags = archetype.getTags().toArray(new String[0]);
45+
List<String> tags = new ArrayList<>(archetype.getTags());
4246
if (tokens.includes(TAGS_INDEX)) {
43-
tags = tokens.get(TAGS_INDEX).split(",");
47+
tags.addAll(Arrays.asList(tokens.get(TAGS_INDEX).split(",")));
4448
}
45-
person.addTags(tags);
49+
person.addTags(tags.toArray(new String[0]));
4650

4751
person.addProperties(archetype.getProperties());
4852
person.addPerspectives(archetype.getPerspectives());

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import com.structurizr.model.SoftwareSystem;
44

5+
import java.util.ArrayList;
6+
import java.util.Arrays;
7+
import java.util.List;
8+
59
final class SoftwareSystemParser extends AbstractParser {
610

711
private static final String GRAMMAR = "softwareSystem <name> [description] [tags]";
@@ -38,11 +42,11 @@ SoftwareSystem parse(ModelDslContext context, Tokens tokens, Archetype archetype
3842
}
3943
softwareSystem.setDescription(description);
4044

41-
String[] tags = archetype.getTags().toArray(new String[0]);
45+
List<String> tags = new ArrayList<>(archetype.getTags());
4246
if (tokens.includes(TAGS_INDEX)) {
43-
tags = tokens.get(TAGS_INDEX).split(",");
47+
tags.addAll(Arrays.asList(tokens.get(TAGS_INDEX).split(",")));
4448
}
45-
softwareSystem.addTags(tags);
49+
softwareSystem.addTags(tags.toArray(new String[0]));
4650

4751
softwareSystem.addProperties(archetype.getProperties());
4852
softwareSystem.addPerspectives(archetype.getPerspectives());

0 commit comments

Comments
 (0)