Skip to content

Commit

Permalink
Tidy up of how groups are handled.
Browse files Browse the repository at this point in the history
  • Loading branch information
simonbrowndotje committed Aug 20, 2024
1 parent 987e0f2 commit d2ccb98
Show file tree
Hide file tree
Showing 19 changed files with 121 additions and 72 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.structurizr.dsl;

import com.structurizr.model.ContainerInstance;
import com.structurizr.model.Element;
import com.structurizr.model.ModelItem;
import com.structurizr.model.StaticStructureElementInstance;

final class ContainerInstanceDslContext extends StaticStructureElementInstanceDslContext {

private ContainerInstance containerInstance;
private final ContainerInstance containerInstance;

ContainerInstanceDslContext(ContainerInstance containerInstance) {
this.containerInstance = containerInstance;
Expand All @@ -21,6 +22,11 @@ ModelItem getModelItem() {
return getContainerInstance();
}

@Override
Element getElement() {
return getContainerInstance();
}

@Override
StaticStructureElementInstance getElementInstance() {
return getContainerInstance();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ final class CustomElementParser extends AbstractParser {
private final static int DESCRIPTION_INDEX = 3;
private final static int TAGS_INDEX = 4;

CustomElement parse(GroupableDslContext context, Tokens tokens) {
CustomElement parse(ModelDslContext context, Tokens tokens) {
// element <name> [metadata] [description] [tags]

if (tokens.hasMoreThan(TAGS_INDEX)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,34 @@
package com.structurizr.dsl;

final class DeploymentEnvironmentDslContext extends GroupableDslContext {
final class DeploymentEnvironmentDslContext extends DslContext implements GroupableDslContext {

private final String environment;
private final ElementGroup group;

DeploymentEnvironmentDslContext(String environment) {
super(null);
this.environment = environment;
this.group = null;
}

DeploymentEnvironmentDslContext(String environment, ElementGroup group) {
super(group);
this.environment = environment;
this.group = group;
}

String getEnvironment() {
return environment;
}

@Override
public boolean hasGroup() {
return group != null;
}

@Override
public ElementGroup getGroup() {
return group;
}

@Override
protected String[] getPermittedTokens() {
return new String[] {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.structurizr.dsl;

import com.structurizr.model.Element;

abstract class ElementDslContext extends ModelItemDslContext {

abstract Element getElement();

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,18 @@

class ElementGroup extends Element {

private static final String STRUCTURIZR_GROUP_SEPARATOR_PROPERTY_NAME = "structurizr.groupSeparator";

private Element parent;
private final ElementGroup parentGroup;
private final String name;

private final Set<Element> elements = new HashSet<>();

ElementGroup(Model model, String name) {
setModel(model);
ElementGroup(String name) {
this.name = name;
this.parentGroup = null;
}

ElementGroup(Model model, String name, ElementGroup parentGroup) {
setModel(model);
String groupSeparator = getModel().getProperties().getOrDefault(STRUCTURIZR_GROUP_SEPARATOR_PROPERTY_NAME, "");

if (StringUtils.isNullOrEmpty(groupSeparator)) {
throw new RuntimeException("To use nested groups, please define a model property named " + STRUCTURIZR_GROUP_SEPARATOR_PROPERTY_NAME);
}

ElementGroup(String name, String groupSeparator, ElementGroup parentGroup) {
this.name = parentGroup.getName() + groupSeparator + name;
this.parentGroup = parentGroup;
}
Expand Down
14 changes: 12 additions & 2 deletions structurizr-dsl/src/main/java/com/structurizr/dsl/GroupParser.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.structurizr.dsl;

import com.structurizr.util.StringUtils;

class GroupParser {

private static final String STRUCTURIZR_GROUP_SEPARATOR_PROPERTY_NAME = "structurizr.groupSeparator";

private static final String GRAMMAR = "group <name> {";

private final static int NAME_INDEX = 1;
Expand All @@ -24,9 +28,15 @@ ElementGroup parse(GroupableDslContext dslContext, Tokens tokens) {

ElementGroup group;
if (dslContext.hasGroup()) {
group = new ElementGroup(dslContext.getWorkspace().getModel(), tokens.get(NAME_INDEX), dslContext.getGroup());
String groupSeparator = ((DslContext)dslContext).getWorkspace().getModel().getProperties().getOrDefault(STRUCTURIZR_GROUP_SEPARATOR_PROPERTY_NAME, "");

if (StringUtils.isNullOrEmpty(groupSeparator)) {
throw new RuntimeException("To use nested groups, please define a model property named " + STRUCTURIZR_GROUP_SEPARATOR_PROPERTY_NAME);
}

group = new ElementGroup(tokens.get(NAME_INDEX), groupSeparator, dslContext.getGroup());
} else {
group = new ElementGroup(dslContext.getWorkspace().getModel(), tokens.get(NAME_INDEX));
group = new ElementGroup(tokens.get(NAME_INDEX));
}

return group;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,9 @@
package com.structurizr.dsl;

abstract class GroupableDslContext extends DslContext {
interface GroupableDslContext {

private ElementGroup group;
boolean hasGroup();

GroupableDslContext() {
this(null);
}

GroupableDslContext(ElementGroup group) {
this.group = group;
}

boolean hasGroup() {
return group != null;
}

ElementGroup getGroup() {
return group;
}
ElementGroup getGroup();

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,26 @@

import com.structurizr.model.GroupableElement;

abstract class GroupableElementDslContext extends ModelItemDslContext {
abstract class GroupableElementDslContext extends ElementDslContext implements GroupableDslContext {

private final ElementGroup group;

GroupableElementDslContext() {
super();
this.group = null;
}

GroupableElementDslContext(ElementGroup group) {
super(group);
this.group = group;
}

@Override
public boolean hasGroup() {
return group != null;
}

@Override
public ElementGroup getGroup() {
return group;
}

abstract GroupableElement getElement();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package com.structurizr.dsl;

import com.structurizr.model.GroupableElement;
import com.structurizr.model.InfrastructureNode;
import com.structurizr.model.ModelItem;

final class InfrastructureNodeDslContext extends ModelItemDslContext {
final class InfrastructureNodeDslContext extends GroupableElementDslContext {

private InfrastructureNode infrastructureNode;
private final InfrastructureNode infrastructureNode;

InfrastructureNodeDslContext(InfrastructureNode infrastructureNode) {
this.infrastructureNode = infrastructureNode;
Expand All @@ -20,6 +21,11 @@ ModelItem getModelItem() {
return getInfrastructureNode();
}

@Override
GroupableElement getElement() {
return infrastructureNode;
}

@Override
protected String[] getPermittedTokens() {
return new String[] {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
package com.structurizr.dsl;

final class ModelDslContext extends GroupableDslContext {
final class ModelDslContext extends DslContext implements GroupableDslContext {

private ElementGroup group;

ModelDslContext() {
super(null);
}

ModelDslContext(ElementGroup group) {
super(group);
this.group = group;
}

@Override
public boolean hasGroup() {
return group != null;
}

@Override
public ElementGroup getGroup() {
return group;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,12 @@

import com.structurizr.model.ModelItem;

abstract class ModelItemDslContext extends GroupableDslContext {
abstract class ModelItemDslContext extends DslContext {

ModelItemDslContext() {
super();
}

ModelItemDslContext(ElementGroup group) {
super(group);
}

abstract ModelItem getModelItem();

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.structurizr.dsl;

import com.structurizr.model.Element;

final class ModelItemParser extends AbstractParser {

private final static int DESCRIPTION_INDEX = 1;
Expand All @@ -26,7 +24,7 @@ void parseTags(ModelItemDslContext context, Tokens tokens) {
}
}

void parseDescription(ModelItemDslContext context, Tokens tokens) {
void parseDescription(ElementDslContext context, Tokens tokens) {
// description <description>
if (tokens.hasMoreThan(DESCRIPTION_INDEX)) {
throw new RuntimeException("Too many tokens, expected: description <description>");
Expand All @@ -37,7 +35,7 @@ void parseDescription(ModelItemDslContext context, Tokens tokens) {
}

String description = tokens.get(DESCRIPTION_INDEX);
((Element)context.getModelItem()).setDescription(description);
context.getElement().setDescription(description);
}

void parseUrl(ModelItemDslContext context, Tokens tokens) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ final class PersonParser extends AbstractParser {
private final static int DESCRIPTION_INDEX = 2;
private final static int TAGS_INDEX = 3;

Person parse(GroupableDslContext context, Tokens tokens) {
Person parse(ModelDslContext context, Tokens tokens) {
// person <name> [description] [tags]

if (tokens.hasMoreThan(TAGS_INDEX)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.structurizr.dsl;

import com.structurizr.model.Element;
import com.structurizr.model.SoftwareSystemInstance;
import com.structurizr.model.ModelItem;
import com.structurizr.model.StaticStructureElementInstance;

final class SoftwareSystemInstanceDslContext extends StaticStructureElementInstanceDslContext {

private SoftwareSystemInstance softwareSystemInstance;
private final SoftwareSystemInstance softwareSystemInstance;

SoftwareSystemInstanceDslContext(SoftwareSystemInstance softwareSystemInstance) {
this.softwareSystemInstance = softwareSystemInstance;
Expand All @@ -21,6 +22,11 @@ ModelItem getModelItem() {
return getSoftwareSystemInstance();
}

@Override
Element getElement() {
return getSoftwareSystemInstance();
}

@Override
StaticStructureElementInstance getElementInstance() {
return getSoftwareSystemInstance();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ final class SoftwareSystemParser extends AbstractParser {
private final static int DESCRIPTION_INDEX = 2;
private final static int TAGS_INDEX = 3;

SoftwareSystem parse(GroupableDslContext context, Tokens tokens) {
SoftwareSystem parse(ModelDslContext context, Tokens tokens) {
// softwareSystem <name> [description] [tags]

if (tokens.hasMoreThan(TAGS_INDEX)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.structurizr.model.StaticStructureElementInstance;

abstract class StaticStructureElementInstanceDslContext extends ModelItemDslContext {
abstract class StaticStructureElementInstanceDslContext extends ElementDslContext {

abstract StaticStructureElementInstance getElementInstance();

Expand Down
Loading

0 comments on commit d2ccb98

Please sign in to comment.