From 0eda61d3555c53e7d382061fb0f8142c2eccc55f Mon Sep 17 00:00:00 2001 From: Simon Brown Date: Tue, 7 Feb 2023 17:09:34 +0000 Subject: [PATCH] Adds the element/relationship identifiers into the model (as an element/relationship property named `"structurizr.dsl.identifier"`). --- build.gradle | 2 +- docs/changelog.md | 4 +++ .../structurizr/dsl/StructurizrDslParser.java | 12 +++++-- src/test/dsl/identifiers.dsl | 14 ++++++++ .../java/com/structurizr/dsl/DslTests.java | 32 +++++++++++++++++++ 5 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 src/test/dsl/identifiers.dsl diff --git a/build.gradle b/build.gradle index 79ba712..6f7abbd 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ targetCompatibility = 1.8 description = 'Structurizr DSL' group = 'com.structurizr' -version = '1.25.0' +version = '1.26.0' test { useJUnitPlatform() diff --git a/docs/changelog.md b/docs/changelog.md index c689553..a12ebec 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,9 @@ # Changelog +## 1.26.0 (unreleased) + +- Adds the element/relationship identifiers into the model (as an element/relationship property named `"structurizr.dsl.identifier"`). + ## 1.25.0 (3rd February 2023) - Fixes some clashing issues with automatic key generation for views. diff --git a/src/main/java/com/structurizr/dsl/StructurizrDslParser.java b/src/main/java/com/structurizr/dsl/StructurizrDslParser.java index 92a1267..3631163 100644 --- a/src/main/java/com/structurizr/dsl/StructurizrDslParser.java +++ b/src/main/java/com/structurizr/dsl/StructurizrDslParser.java @@ -29,6 +29,8 @@ public final class StructurizrDslParser extends StructurizrDslTokens { private static final Pattern STRING_SUBSTITUTION_PATTERN = Pattern.compile("(\\$\\{[a-zA-Z0-9-_.]+?})"); + private static final String STRUCTURIZR_DSL_IDENTIFIER_PROPERTY_NAME = "structurizr.dsl.identifier"; + private IdentifierScope identifierScope = IdentifierScope.Flat; private Stack contextStack; private Set parsedTokens = new HashSet<>(); @@ -873,11 +875,17 @@ public IdentifiersRegister getIdentifiersRegister() { } private void registerIdentifier(String identifier, Element element) { - identifiersRegister.register(identifier, element); + if (!StringUtils.isNullOrEmpty(identifier)) { + identifiersRegister.register(identifier, element); + element.addProperty(STRUCTURIZR_DSL_IDENTIFIER_PROPERTY_NAME, identifiersRegister.findIdentifier(element)); + } } private void registerIdentifier(String identifier, Relationship relationship) { - identifiersRegister.register(identifier, relationship); + if (!StringUtils.isNullOrEmpty(identifier)) { + identifiersRegister.register(identifier, relationship); + relationship.addProperty(STRUCTURIZR_DSL_IDENTIFIER_PROPERTY_NAME, identifiersRegister.findIdentifier(relationship)); + } } private boolean inContext(Class clazz) { diff --git a/src/test/dsl/identifiers.dsl b/src/test/dsl/identifiers.dsl new file mode 100644 index 0000000..d4a32f2 --- /dev/null +++ b/src/test/dsl/identifiers.dsl @@ -0,0 +1,14 @@ +workspace { + + !identifiers hierarchical + + model { + user = person "User" + softwareSystem = softwareSystem "Software System" { + container = container "Container" { + rel = user -> this "Uses" + } + } + } + +} \ No newline at end of file diff --git a/src/test/java/com/structurizr/dsl/DslTests.java b/src/test/java/com/structurizr/dsl/DslTests.java index 8f90b2c..b6c1fcb 100644 --- a/src/test/java/com/structurizr/dsl/DslTests.java +++ b/src/test/java/com/structurizr/dsl/DslTests.java @@ -1033,4 +1033,36 @@ void test_viewsWithoutKeys() throws Exception { assertTrue(parser.getWorkspace().getViews().getSystemLandscapeViews().stream().anyMatch(view -> view.getKey().equals("SystemLandscape-3"))); } + @Test + void test_identifiers() throws Exception { + StructurizrDslParser parser = new StructurizrDslParser(); + parser.parse(new File("src/test/dsl/identifiers.dsl")); + + Workspace workspace = parser.getWorkspace(); + Model model = workspace.getModel(); + + Person user = model.getPersonWithName("User"); + SoftwareSystem softwareSystem = model.getSoftwareSystemWithName("Software System"); + Container container = softwareSystem.getContainerWithName("Container"); + Relationship relationship = user.getEfferentRelationshipWith(container); + Relationship impliedRelationship = user.getEfferentRelationshipWith(softwareSystem); + + IdentifiersRegister register = parser.getIdentifiersRegister(); + assertEquals("user", register.findIdentifier(user)); + assertEquals("softwaresystem", register.findIdentifier(softwareSystem)); + assertEquals("softwaresystem.container", register.findIdentifier(container)); + assertEquals("rel", register.findIdentifier(relationship)); + + assertSame(user, register.getElement("user")); + assertSame(softwareSystem, register.getElement("softwareSystem")); + assertSame(container, register.getElement("softwareSystem.container")); + assertSame(relationship, register.getRelationship("rel")); + + assertEquals("user", user.getProperties().get("structurizr.dsl.identifier")); + assertEquals("softwaresystem", softwareSystem.getProperties().get("structurizr.dsl.identifier")); + assertEquals("softwaresystem.container", container.getProperties().get("structurizr.dsl.identifier")); + assertEquals("rel", relationship.getProperties().get("structurizr.dsl.identifier")); + assertNull(impliedRelationship.getProperties().get("structurizr.dsl.identifier")); + } + } \ No newline at end of file