Skip to content

Commit ea34e48

Browse files
structurizr-dsl: Identifiers are no longer stored as lower case in the JSON (structurizr.dsl.identifier property on elements and relationships).
1 parent b68b29f commit ea34e48

File tree

4 files changed

+102
-20
lines changed

4 files changed

+102
-20
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
- structurizr-dsl: Constants and variables are inherited when extending a DSL workspace.
2222
- structurizr-dsl: DSL source is only stored in the JSON workspace when the DSL is deemed as "portable" (i.e. no files, plugins, scripts).
2323
- structurizr-dsl: Deprecates `StructurizrDSLParser.setRestricted(boolean)` in favour of finer-grained features.
24+
- structurizr-dsl: Identifiers are no longer stored as lower case in the JSON (`structurizr.dsl.identifier` property on elements and relationships).
2425
- structurizr-export: Removes support for deprecated enterprise and location concepts.
2526
- structurizr-export: PlantUML exporters - replaces skinparams with styles.
2627
- structurizr-export: PlantUML exporters - adds support for dark mode exports.

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

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,13 @@ public Set<String> getRelationshipIdentifiers() {
7070
* @return an Element, or null if one doesn't exist
7171
*/
7272
public Element getElement(String identifier) {
73-
identifier = identifier.toLowerCase();
74-
return elementsByIdentifier.get(identifier);
73+
for (String key : elementsByIdentifier.keySet()) {
74+
if (key.equalsIgnoreCase(identifier)) {
75+
return elementsByIdentifier.get(key);
76+
}
77+
}
78+
79+
return null;
7580
}
7681

7782
/**
@@ -89,8 +94,6 @@ public void register(String identifier, Element element) {
8994
identifier = UUID.randomUUID().toString();
9095
}
9196

92-
identifier = identifier.toLowerCase();
93-
9497
if (identifierScope == IdentifierScope.Hierarchical) {
9598
identifier = calculateHierarchicalIdentifier(identifier, element);
9699
}
@@ -99,17 +102,17 @@ public void register(String identifier, Element element) {
99102
for (String id : elementsByIdentifier.keySet()) {
100103
Element e = elementsByIdentifier.get(id);
101104

102-
if (e.equals(element) && !id.equals(identifier)) {
105+
if (e.equals(element) && !id.equalsIgnoreCase(identifier)) {
103106
if (id.matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")) {
104-
throw new RuntimeException("Please assign an identifier to \"" + element.getCanonicalName() + "\" before using it with !ref");
107+
throw new RuntimeException("Please assign an identifier to \"" + element.getCanonicalName() + "\" before using it");
105108
} else {
106109
throw new RuntimeException("The element is already registered with an identifier of \"" + id + "\"");
107110
}
108111
}
109112
}
110113

111-
Element e = elementsByIdentifier.get(identifier);
112-
Relationship r = relationshipsByIdentifier.get(identifier);
114+
Element e = getElement(identifier);
115+
Relationship r = getRelationship(identifier);
113116

114117
if ((e == null && r == null) || (e == element)) {
115118
elementsByIdentifier.put(identifier, element);
@@ -125,8 +128,13 @@ public void register(String identifier, Element element) {
125128
* @return a Relationship, or null if one doesn't exist
126129
*/
127130
public Relationship getRelationship(String identifier) {
128-
identifier = identifier.toLowerCase();
129-
return relationshipsByIdentifier.get(identifier);
131+
for (String key : relationshipsByIdentifier.keySet()) {
132+
if (key.equalsIgnoreCase(identifier)) {
133+
return relationshipsByIdentifier.get(key);
134+
}
135+
}
136+
137+
return null;
130138
}
131139

132140
/**
@@ -144,10 +152,21 @@ public void register(String identifier, Relationship relationship) {
144152
identifier = UUID.randomUUID().toString();
145153
}
146154

147-
identifier = identifier.toLowerCase();
155+
// check whether this relationship has already been registered with another identifier
156+
for (String id : relationshipsByIdentifier.keySet()) {
157+
Relationship r = relationshipsByIdentifier.get(id);
158+
159+
if (r.equals(relationship) && !id.equalsIgnoreCase(identifier)) {
160+
if (id.matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")) {
161+
throw new RuntimeException("Please assign an identifier to \"" + relationship.getCanonicalName() + "\" before using it");
162+
} else {
163+
throw new RuntimeException("The relationship is already registered with an identifier of \"" + id + "\"");
164+
}
165+
}
166+
}
148167

149-
Element e = elementsByIdentifier.get(identifier);
150-
Relationship r = relationshipsByIdentifier.get(identifier);
168+
Element e = getElement(identifier);
169+
Relationship r = getRelationship(identifier);
151170

152171
if ((e == null && r == null) || (r == relationship)) {
153172
relationshipsByIdentifier.put(identifier, relationship);

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,18 +1059,20 @@ void test_identifiers() throws Exception {
10591059

10601060
IdentifiersRegister register = parser.getIdentifiersRegister();
10611061
assertEquals("user", register.findIdentifier(user));
1062-
assertEquals("softwaresystem", register.findIdentifier(softwareSystem));
1063-
assertEquals("softwaresystem.container", register.findIdentifier(container));
1062+
assertEquals("softwareSystem", register.findIdentifier(softwareSystem));
1063+
assertEquals("softwareSystem.container", register.findIdentifier(container));
10641064
assertEquals("rel", register.findIdentifier(relationship));
10651065

10661066
assertSame(user, register.getElement("user"));
10671067
assertSame(softwareSystem, register.getElement("softwareSystem"));
1068+
assertSame(softwareSystem, register.getElement("softwaresystem"));
10681069
assertSame(container, register.getElement("softwareSystem.container"));
1070+
assertSame(container, register.getElement("softwaresystem.container"));
10691071
assertSame(relationship, register.getRelationship("rel"));
10701072

10711073
assertEquals("user", user.getProperties().get("structurizr.dsl.identifier"));
1072-
assertEquals("softwaresystem", softwareSystem.getProperties().get("structurizr.dsl.identifier"));
1073-
assertEquals("softwaresystem.container", container.getProperties().get("structurizr.dsl.identifier"));
1074+
assertEquals("softwareSystem", softwareSystem.getProperties().get("structurizr.dsl.identifier"));
1075+
assertEquals("softwareSystem.container", container.getProperties().get("structurizr.dsl.identifier"));
10741076
assertEquals("rel", relationship.getProperties().get("structurizr.dsl.identifier"));
10751077
assertNull(impliedRelationship.getProperties().get("structurizr.dsl.identifier"));
10761078
}

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

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

3+
import com.structurizr.model.Relationship;
34
import com.structurizr.model.SoftwareSystem;
45
import org.junit.jupiter.api.Test;
56

6-
import static org.junit.jupiter.api.Assertions.assertEquals;
7-
import static org.junit.jupiter.api.Assertions.fail;
7+
import static org.junit.jupiter.api.Assertions.*;
88

99
class IdentifierRegisterTests extends AbstractTests {
1010

@@ -56,7 +56,67 @@ void test_register_ThrowsAnException_WhenTheElementHasAlreadyBeenRegisteredWithA
5656
register.register("x", softwareSystem);
5757
fail();
5858
} catch (Exception e) {
59-
assertEquals("Please assign an identifier to \"SoftwareSystem://Software System\" before using it with !ref", e.getMessage());
59+
assertEquals("Please assign an identifier to \"SoftwareSystem://Software System\" before using it", e.getMessage());
60+
}
61+
}
62+
63+
@Test
64+
void test_register_WhenTheElementHasAlreadyBeenRegisteredWithTheSameIdentifierCasedDifferently() {
65+
SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System");
66+
register.register("SoftwareSystem", softwareSystem);
67+
register.register("softwareSystem", softwareSystem);
68+
register.register("softwaresystem", softwareSystem);
69+
register.register("SOFTWARESYSTEM", softwareSystem);
70+
}
71+
72+
@Test
73+
void test_getElement() {
74+
SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System");
75+
register.register("SoftwareSystem", softwareSystem);
76+
77+
assertSame(softwareSystem, register.getElement("SoftwareSystem"));
78+
assertSame(softwareSystem, register.getElement("softwareSystem"));
79+
assertSame(softwareSystem, register.getElement("softwaresystem"));
80+
assertSame(softwareSystem, register.getElement("SOFTWARESYSTEM"));
81+
}
82+
83+
@Test
84+
void test_getRelationships() {
85+
SoftwareSystem a = model.addSoftwareSystem("A");
86+
SoftwareSystem b = model.addSoftwareSystem("B");
87+
Relationship rel = a.uses(b, "Uses");
88+
register.register("Rel", rel);
89+
90+
assertSame(rel, register.getRelationship("Rel"));
91+
assertSame(rel, register.getRelationship("rel"));
92+
assertSame(rel, register.getRelationship("REL"));
93+
}
94+
95+
@Test
96+
void test_register_ThrowsAnException_WhenTheRelationshipHasAlreadyBeenRegisteredWithADifferentIdentifier() {
97+
SoftwareSystem a = model.addSoftwareSystem("A");
98+
SoftwareSystem b = model.addSoftwareSystem("B");
99+
Relationship rel = a.uses(b, "Uses");
100+
try {
101+
register.register("Rel1", rel);
102+
register.register("Rel2", rel);
103+
fail();
104+
} catch (Exception e) {
105+
assertEquals("The relationship is already registered with an identifier of \"Rel1\"", e.getMessage());
106+
}
107+
}
108+
109+
@Test
110+
void test_register_ThrowsAnException_WhenTheRelationshipHasAlreadyBeenRegisteredWithAnInternalIdentifier() {
111+
SoftwareSystem a = model.addSoftwareSystem("A");
112+
SoftwareSystem b = model.addSoftwareSystem("B");
113+
Relationship rel = a.uses(b, "Uses");
114+
try {
115+
register.register("", rel);
116+
register.register("Rel", rel);
117+
fail();
118+
} catch (Exception e) {
119+
assertEquals("Please assign an identifier to \"Relationship://SoftwareSystem://A -> SoftwareSystem://B (Uses)\" before using it", e.getMessage());
60120
}
61121
}
62122

0 commit comments

Comments
 (0)