Skip to content
This repository was archived by the owner on Mar 28, 2026. It is now read-only.

Commit 109c891

Browse files
Added support for sorting views by the order in which they are created.
1 parent 59176ba commit 109c891

6 files changed

Lines changed: 87 additions & 1 deletion

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ subprojects { proj ->
1414

1515
description = 'Structurizr'
1616
group = 'com.structurizr'
17-
version = '1.12.1'
17+
version = '1.12.2'
1818

1919
repositories {
2020
mavenCentral()

docs/changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 1.12.2 (30th March 2022)
4+
5+
- Added support for sorting views by the order in which they are created.
6+
37
## 1.12.1 (2nd March 2022)
48

59
- Renamed `Decision.Link.type` to `Decision.Link.description`.

structurizr-core/src/com/structurizr/view/FilteredView.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public final class FilteredView {
1515
private String baseViewKey;
1616

1717
private String key;
18+
private int order;
1819
private String description = "";
1920

2021
private FilterMode mode = FilterMode.Exclude;
@@ -60,6 +61,19 @@ void setKey(String key) {
6061
this.key = key;
6162
}
6263

64+
/**
65+
* Gets the order of this view.
66+
*
67+
* @return a positive integer
68+
*/
69+
public int getOrder() {
70+
return order;
71+
}
72+
73+
void setOrder(int order) {
74+
this.order = Math.max(1, order);
75+
}
76+
6377
public String getDescription() {
6478
return description;
6579
}

structurizr-core/src/com/structurizr/view/View.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public abstract class View {
2424
private String softwareSystemId;
2525
private String description = "";
2626
private String key;
27+
private int order;
2728
private PaperSize paperSize = null;
2829
private Dimensions dimensions = null;
2930
private AutomaticLayout automaticLayout = null;
@@ -125,6 +126,19 @@ void setKey(String key) {
125126
this.key = key;
126127
}
127128

129+
/**
130+
* Gets the order of this view.
131+
*
132+
* @return a positive integer
133+
*/
134+
public int getOrder() {
135+
return order;
136+
}
137+
138+
void setOrder(int order) {
139+
this.order = Math.max(1, order);
140+
}
141+
128142
/**
129143
* Gets the paper size that should be used to render this view.
130144
*

structurizr-core/src/com/structurizr/view/ViewSet.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public CustomView createCustomView(String key, String title, String description)
5353
assertThatTheViewKeyIsSpecifiedAndUnique(key);
5454

5555
CustomView view = new CustomView(model, key, title, description);
56+
view.setOrder(getNextOrder());
5657
view.setViewSet(this);
5758
customViews.add(view);
5859
return view;
@@ -70,6 +71,7 @@ public SystemLandscapeView createSystemLandscapeView(String key, String descript
7071
assertThatTheViewKeyIsSpecifiedAndUnique(key);
7172

7273
SystemLandscapeView view = new SystemLandscapeView(model, key, description);
74+
view.setOrder(getNextOrder());
7375
view.setViewSet(this);
7476
systemLandscapeViews.add(view);
7577
return view;
@@ -89,6 +91,7 @@ public SystemContextView createSystemContextView(SoftwareSystem softwareSystem,
8991
assertThatTheViewKeyIsSpecifiedAndUnique(key);
9092

9193
SystemContextView view = new SystemContextView(softwareSystem, key, description);
94+
view.setOrder(getNextOrder());
9295
view.setViewSet(this);
9396
systemContextViews.add(view);
9497
return view;
@@ -108,6 +111,7 @@ public ContainerView createContainerView(SoftwareSystem softwareSystem, String k
108111
assertThatTheViewKeyIsSpecifiedAndUnique(key);
109112

110113
ContainerView view = new ContainerView(softwareSystem, key, description);
114+
view.setOrder(getNextOrder());
111115
view.setViewSet(this);
112116
containerViews.add(view);
113117
return view;
@@ -127,6 +131,7 @@ public ComponentView createComponentView(Container container, String key, String
127131
assertThatTheViewKeyIsSpecifiedAndUnique(key);
128132

129133
ComponentView view = new ComponentView(container, key, description);
134+
view.setOrder(getNextOrder());
130135
view.setViewSet(this);
131136
componentViews.add(view);
132137
return view;
@@ -144,6 +149,7 @@ public DynamicView createDynamicView(String key, String description) {
144149
assertThatTheViewKeyIsSpecifiedAndUnique(key);
145150

146151
DynamicView view = new DynamicView(model, key, description);
152+
view.setOrder(getNextOrder());
147153
view.setViewSet(this);
148154
dynamicViews.add(view);
149155
return view;
@@ -170,6 +176,7 @@ public DynamicView createDynamicView(SoftwareSystem softwareSystem, String key,
170176
assertThatTheViewKeyIsSpecifiedAndUnique(key);
171177

172178
DynamicView view = new DynamicView(softwareSystem, key, description);
179+
view.setOrder(getNextOrder());
173180
view.setViewSet(this);
174181
dynamicViews.add(view);
175182
return view;
@@ -197,6 +204,7 @@ public DynamicView createDynamicView(Container container, String key, String des
197204
assertThatTheViewKeyIsSpecifiedAndUnique(key);
198205

199206
DynamicView view = new DynamicView(container, key, description);
207+
view.setOrder(getNextOrder());
200208
view.setViewSet(this);
201209
dynamicViews.add(view);
202210
return view;
@@ -214,6 +222,7 @@ public DeploymentView createDeploymentView(String key, String description) {
214222
assertThatTheViewKeyIsSpecifiedAndUnique(key);
215223

216224
DeploymentView view = new DeploymentView(model, key, description);
225+
view.setOrder(getNextOrder());
217226
view.setViewSet(this);
218227
deploymentViews.add(view);
219228
return view;
@@ -233,6 +242,7 @@ public DeploymentView createDeploymentView(SoftwareSystem softwareSystem, String
233242
assertThatTheViewKeyIsSpecifiedAndUnique(key);
234243

235244
DeploymentView view = new DeploymentView(softwareSystem, key, description);
245+
view.setOrder(getNextOrder());
236246
view.setViewSet(this);
237247
deploymentViews.add(view);
238248
return view;
@@ -253,6 +263,7 @@ public FilteredView createFilteredView(StaticView view, String key, String descr
253263
assertThatTheViewKeyIsSpecifiedAndUnique(key);
254264

255265
FilteredView filteredView = new FilteredView(view, key, description, mode, tags);
266+
filteredView.setOrder(getNextOrder());
256267
filteredViews.add(filteredView);
257268
return filteredView;
258269
}
@@ -624,6 +635,21 @@ private void checkViewKeysAreUnique() {
624635
}
625636
}
626637

638+
private synchronized int getNextOrder() {
639+
int order = 0;
640+
641+
order = Math.max(order, customViews.stream().max(Comparator.comparingInt(View::getOrder)).map(View::getOrder).orElse(0));
642+
order = Math.max(order, systemLandscapeViews.stream().max(Comparator.comparingInt(View::getOrder)).map(View::getOrder).orElse(0));
643+
order = Math.max(order, systemContextViews.stream().max(Comparator.comparingInt(View::getOrder)).map(View::getOrder).orElse(0));
644+
order = Math.max(order, containerViews.stream().max(Comparator.comparingInt(View::getOrder)).map(View::getOrder).orElse(0));
645+
order = Math.max(order, componentViews.stream().max(Comparator.comparingInt(View::getOrder)).map(View::getOrder).orElse(0));
646+
order = Math.max(order, dynamicViews.stream().max(Comparator.comparingInt(View::getOrder)).map(View::getOrder).orElse(0));
647+
order = Math.max(order, deploymentViews.stream().max(Comparator.comparingInt(View::getOrder)).map(View::getOrder).orElse(0));
648+
order = Math.max(order, filteredViews.stream().max(Comparator.comparingInt(FilteredView::getOrder)).map(FilteredView::getOrder).orElse(0));
649+
650+
return order + 1;
651+
}
652+
627653
/**
628654
* Gets the configuration object associated with this set of views.
629655
*

structurizr-core/test/unit/com/structurizr/view/ViewSetTests.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,4 +1094,32 @@ public void test_copyLayoutInformationFrom_DoesNothing_WhenMergeFromRemoteIsSetT
10941094
assertNull(view2.getPaperSize());
10951095
}
10961096

1097+
@Test
1098+
public void test_view_ordering() {
1099+
Workspace workspace = new Workspace("Name", "Description");
1100+
SoftwareSystem softwareSystem = workspace.getModel().addSoftwareSystem("Software System");
1101+
Container container = softwareSystem.addContainer("Container");
1102+
ViewSet views = workspace.getViews();
1103+
1104+
CustomView customView = views.createCustomView("custom1", "Title", "Description");
1105+
SystemLandscapeView systemLandscapeView1 = views.createSystemLandscapeView("landscape1", "Description");
1106+
FilteredView filteredView = views.createFilteredView(systemLandscapeView1, "filtered1", "Description", FilterMode.Include, "Tag 1");
1107+
SystemContextView systemContextView = views.createSystemContextView(softwareSystem, "context1", "Description");
1108+
ContainerView containerView = views.createContainerView(softwareSystem, "container1", "Description");
1109+
ComponentView componentView = views.createComponentView(container, "component1", "Description");
1110+
DynamicView dynamicView = views.createDynamicView("dynamic1", "Description");
1111+
DeploymentView deploymentView = views.createDeploymentView("deployment1", "Description");
1112+
SystemLandscapeView systemLandscapeView2 = views.createSystemLandscapeView("landscape2", "Description");
1113+
1114+
assertEquals(1, customView.getOrder());
1115+
assertEquals(2, systemLandscapeView1.getOrder());
1116+
assertEquals(3, filteredView.getOrder());
1117+
assertEquals(4, systemContextView.getOrder());
1118+
assertEquals(5, containerView.getOrder());
1119+
assertEquals(6, componentView.getOrder());
1120+
assertEquals(7, dynamicView.getOrder());
1121+
assertEquals(8, deploymentView.getOrder());
1122+
assertEquals(9, systemLandscapeView2.getOrder());
1123+
}
1124+
10971125
}

0 commit comments

Comments
 (0)