Skip to content

Commit 28a8740

Browse files
authored
[NAD] Add DefaultLabelProviderFactory and refactor DefaultLabelProvider parameters (#769)
* Add DefaultLabelProviderFactory * Add unit tests * Add getter on factory and on provider * Move EdgeInfoParameters * Move EdgeInfoType enum Signed-off-by: Florian Dupuy <florian.dupuy@rte-france.com>
1 parent b3aec3f commit 28a8740

21 files changed

+328
-123
lines changed

network-area-diagram/src/main/java/com/powsybl/nad/NadParameters.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class NadParameters {
3030
private SvgParameters svgParameters = new SvgParameters();
3131
private LayoutParameters layoutParameters = new LayoutParameters();
3232
private StyleProviderFactory styleProviderFactory = TopologicalStyleProvider::new;
33-
private LabelProviderFactory labelProviderFactory = (network, svgParam) -> new DefaultLabelProvider(network, svgParam.createValueFormatter());
33+
private LabelProviderFactory labelProviderFactory = new DefaultLabelProviderFactory();
3434
private LayoutFactory layoutFactory = Atlas2ForceLayout::new;
3535
private IdProviderFactory idProviderFactory = IntIdProvider::new;
3636
private NadComponentLibrary componentLibrary = new DefaultComponentLibrary();
@@ -72,6 +72,10 @@ public NadParameters setLabelProviderFactory(LabelProviderFactory labelProviderF
7272
return this;
7373
}
7474

75+
public LabelProviderFactory getLabelProviderFactory() {
76+
return labelProviderFactory;
77+
}
78+
7579
public LayoutFactory getLayoutFactory() {
7680
return layoutFactory;
7781
}

network-area-diagram/src/main/java/com/powsybl/nad/svg/CustomLabelProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ public Optional<EdgeInfo> getInjectionEdgeInfo(String injectionId) {
105105

106106
@Override
107107
public Optional<EdgeInfo> getBranchEdgeInfo(String branchId, String branchType) {
108-
BranchLabels bl = branchLabels.get(branchId);
109-
return Optional.of(new EdgeInfo(INFO_TYPE, INFO_TYPE, bl.arrowMiddle, bl.middle1, bl.middle2));
108+
return Optional.ofNullable(branchLabels.get(branchId))
109+
.map(bl -> new EdgeInfo(INFO_TYPE, INFO_TYPE, bl.arrowMiddle, bl.middle1, bl.middle2));
110110
}
111111

112112
@Override
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright (c) 2026, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
* SPDX-License-Identifier: MPL-2.0
7+
*/
8+
package com.powsybl.nad.svg;
9+
10+
/**
11+
* @author Florian Dupuy {@literal <florian.dupuy at rte-france.com>}
12+
*/
13+
public enum EdgeInfoEnum {
14+
ACTIVE_POWER,
15+
REACTIVE_POWER,
16+
CURRENT,
17+
NAME,
18+
VALUE_PERMANENT_LIMIT_PERCENTAGE,
19+
EMPTY
20+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright (c) 2026, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
* SPDX-License-Identifier: MPL-2.0
7+
*/
8+
package com.powsybl.nad.svg;
9+
10+
/**
11+
* @author Florian Dupuy {@literal <florian.dupuy at rte-france.com>}
12+
*/
13+
public record EdgeInfoParameters(EdgeInfoEnum infoSideExternal,
14+
EdgeInfoEnum infoMiddleSide1,
15+
EdgeInfoEnum infoMiddleSide2,
16+
EdgeInfoEnum infoSideInternal) {
17+
}

network-area-diagram/src/main/java/com/powsybl/nad/svg/LabelProviderParameters.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ public class LabelProviderParameters {
1010
private boolean idDisplayed = false;
1111
private boolean voltageLevelDetails = false;
1212
private boolean doubleArrowsDisplayed = false;
13+
private EdgeInfoParameters edgeInfoParameters = new EdgeInfoParameters(
14+
EdgeInfoEnum.ACTIVE_POWER,
15+
EdgeInfoEnum.EMPTY,
16+
EdgeInfoEnum.EMPTY,
17+
EdgeInfoEnum.EMPTY);
1318

1419
public boolean isBusLegend() {
1520
return isBusLegend;
@@ -55,4 +60,13 @@ public LabelProviderParameters setDoubleArrowsDisplayed(boolean doubleArrowsDisp
5560
this.doubleArrowsDisplayed = doubleArrowsDisplayed;
5661
return this;
5762
}
63+
64+
public EdgeInfoParameters getEdgeInfoParameters() {
65+
return edgeInfoParameters;
66+
}
67+
68+
public LabelProviderParameters setEdgeInfoParameters(EdgeInfoParameters edgeInfoParameters) {
69+
this.edgeInfoParameters = edgeInfoParameters;
70+
return this;
71+
}
5872
}

network-area-diagram/src/main/java/com/powsybl/nad/svg/iidm/DefaultLabelProvider.java

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@
1212
import com.powsybl.iidm.network.*;
1313
import com.powsybl.nad.model.BranchEdge;
1414
import com.powsybl.nad.model.ThreeWtEdge;
15-
import com.powsybl.nad.svg.LabelProviderParameters;
16-
import com.powsybl.nad.svg.EdgeInfo;
17-
import com.powsybl.nad.svg.LabelProvider;
18-
import com.powsybl.nad.svg.SvgParameters;
19-
import com.powsybl.nad.svg.VoltageLevelLegend;
15+
import com.powsybl.nad.svg.*;
2016
import com.powsybl.nad.utils.iidm.IidmUtils;
2117

2218
import java.util.*;
@@ -27,7 +23,6 @@
2723
*/
2824
public class DefaultLabelProvider implements LabelProvider {
2925

30-
private final EdgeInfoParameters edgeInfoParameters;
3126
private final Network network;
3227
private final LabelProviderParameters parameters;
3328
private final ValueFormatter valueFormatter;
@@ -36,30 +31,24 @@ public class DefaultLabelProvider implements LabelProvider {
3631

3732
public DefaultLabelProvider(Network network, SvgParameters svgParameters) {
3833
this.network = network;
39-
this.edgeInfoParameters = new EdgeInfoParameters(EdgeInfoEnum.ACTIVE_POWER, EdgeInfoEnum.EMPTY, EdgeInfoEnum.EMPTY, EdgeInfoEnum.EMPTY);
4034
this.valueFormatter = svgParameters.createValueFormatter();
4135
this.parameters = new LabelProviderParameters();
4236
}
4337

4438
public DefaultLabelProvider(Network network, ValueFormatter valueFormatter) {
4539
this.network = network;
46-
this.edgeInfoParameters = new EdgeInfoParameters(EdgeInfoEnum.ACTIVE_POWER, EdgeInfoEnum.EMPTY, EdgeInfoEnum.EMPTY, EdgeInfoEnum.EMPTY);
4740
this.valueFormatter = valueFormatter;
4841
this.parameters = new LabelProviderParameters();
4942
}
5043

5144
public DefaultLabelProvider(Network network, ValueFormatter valueFormatter, LabelProviderParameters parameters) {
5245
this.network = network;
53-
this.edgeInfoParameters = new EdgeInfoParameters(EdgeInfoEnum.ACTIVE_POWER, EdgeInfoEnum.EMPTY, EdgeInfoEnum.EMPTY, EdgeInfoEnum.EMPTY);
5446
this.valueFormatter = valueFormatter;
5547
this.parameters = parameters;
5648
}
5749

58-
public DefaultLabelProvider(Network network, EdgeInfoParameters edgeInfoParameters, ValueFormatter valueFormatter, LabelProviderParameters parameters) {
59-
this.network = network;
60-
this.edgeInfoParameters = edgeInfoParameters;
61-
this.valueFormatter = valueFormatter;
62-
this.parameters = parameters;
50+
public LabelProviderParameters getParameters() {
51+
return parameters;
6352
}
6453

6554
public static Optional<Double> toOptional(double value) {
@@ -128,11 +117,13 @@ protected ValueFormatter getValueFormatter() {
128117
}
129118

130119
private Optional<EdgeInfo> getEdgeInfo(Terminal terminal) {
131-
return getEdgeInfo(terminal, edgeInfoParameters.infoSideInternal, edgeInfoParameters.infoSideExternal);
120+
var edgeInfoParameters = parameters.getEdgeInfoParameters();
121+
return getEdgeInfo(terminal, edgeInfoParameters.infoSideInternal(), edgeInfoParameters.infoSideExternal());
132122
}
133123

134124
private Optional<EdgeInfo> getMiddleEdgeInfo(Terminal terminal) {
135-
return getEdgeInfo(terminal, edgeInfoParameters.infoMiddleSide1, edgeInfoParameters.infoMiddleSide2);
125+
var edgeInfoParameters = parameters.getEdgeInfoParameters();
126+
return getEdgeInfo(terminal, edgeInfoParameters.infoMiddleSide1(), edgeInfoParameters.infoMiddleSide2());
136127
}
137128

138129
private Optional<EdgeInfo> getEdgeInfo(Terminal terminal, EdgeInfoEnum infoEnum1, EdgeInfoEnum infoEnum2) {
@@ -261,15 +252,6 @@ private List<String> getLegendFooter(VoltageLevel voltageLevel) {
261252
return voltageLevelDetails;
262253
}
263254

264-
public enum EdgeInfoEnum {
265-
ACTIVE_POWER,
266-
REACTIVE_POWER,
267-
CURRENT,
268-
NAME,
269-
VALUE_PERMANENT_LIMIT_PERCENTAGE,
270-
EMPTY
271-
}
272-
273255
public static class Builder {
274256
private EdgeInfoEnum infoSideExternal = EdgeInfoEnum.ACTIVE_POWER;
275257
private EdgeInfoEnum infoMiddleSide1 = EdgeInfoEnum.EMPTY;
@@ -323,21 +305,16 @@ public Builder setDoubleArrowsDisplayed(boolean doubleArrowsDisplayed) {
323305
}
324306

325307
public DefaultLabelProvider build(Network network, SvgParameters svgParameters) {
326-
return new DefaultLabelProvider(network,
327-
new EdgeInfoParameters(infoSideExternal, infoMiddleSide1, infoMiddleSide2, infoSideInternal),
328-
svgParameters.createValueFormatter(), parameters);
308+
parameters.setEdgeInfoParameters(
309+
new EdgeInfoParameters(infoSideExternal, infoMiddleSide1, infoMiddleSide2, infoSideInternal));
310+
return new DefaultLabelProvider(network, svgParameters.createValueFormatter(), parameters);
329311
}
330312

331313
public DefaultLabelProvider build(Network network, ValueFormatter valueFormatter) {
332-
return new DefaultLabelProvider(network,
333-
new EdgeInfoParameters(infoSideExternal, infoMiddleSide1, infoMiddleSide2, infoSideInternal),
334-
valueFormatter, parameters);
314+
parameters.setEdgeInfoParameters(
315+
new EdgeInfoParameters(infoSideExternal, infoMiddleSide1, infoMiddleSide2, infoSideInternal));
316+
return new DefaultLabelProvider(network, valueFormatter, parameters);
335317
}
336318
}
337319

338-
public record EdgeInfoParameters(EdgeInfoEnum infoSideExternal,
339-
EdgeInfoEnum infoMiddleSide1,
340-
EdgeInfoEnum infoMiddleSide2,
341-
EdgeInfoEnum infoSideInternal) {
342-
}
343320
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
* SPDX-License-Identifier: MPL-2.0
7+
*/
8+
package com.powsybl.nad.svg.iidm;
9+
10+
import com.powsybl.iidm.network.Network;
11+
import com.powsybl.nad.svg.*;
12+
13+
/**
14+
* @author Florian Dupuy {@literal <florian.dupuy at rte-france.com>}
15+
*/
16+
public record DefaultLabelProviderFactory(LabelProviderParameters parameters) implements LabelProviderFactory {
17+
18+
public DefaultLabelProviderFactory() {
19+
this(new LabelProviderParameters());
20+
}
21+
22+
@Override
23+
public LabelProvider create(Network network, SvgParameters svgParameters) {
24+
return new DefaultLabelProvider(network, svgParameters.createValueFormatter(), parameters);
25+
}
26+
27+
public LabelProviderParameters getParameters() {
28+
return parameters;
29+
}
30+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/*
2+
* Copyright (c) 2026, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
* SPDX-License-Identifier: MPL-2.0
7+
*/
8+
package com.powsybl.nad;
9+
10+
import com.powsybl.diagram.test.Networks;
11+
import com.powsybl.iidm.network.Network;
12+
import com.powsybl.nad.build.iidm.IntIdProvider;
13+
import com.powsybl.nad.layout.Atlas2ForceLayout;
14+
import com.powsybl.nad.layout.LayoutFactory;
15+
import com.powsybl.nad.layout.LayoutParameters;
16+
import com.powsybl.nad.library.DefaultComponentLibrary;
17+
import com.powsybl.nad.library.NadComponentLibrary;
18+
import com.powsybl.nad.routing.EdgeRouting;
19+
import com.powsybl.nad.routing.StraightEdgeRouting;
20+
import com.powsybl.nad.svg.*;
21+
import com.powsybl.nad.svg.iidm.*;
22+
import org.junit.jupiter.api.Test;
23+
24+
import static org.junit.jupiter.api.Assertions.*;
25+
26+
class NadParametersTest {
27+
28+
@Test
29+
void testDefaults() {
30+
NadParameters params = new NadParameters();
31+
assertNotNull(params.getSvgParameters());
32+
assertNotNull(params.getLayoutParameters());
33+
assertNotNull(params.getStyleProviderFactory());
34+
assertNotNull(params.getLayoutFactory());
35+
assertInstanceOf(Atlas2ForceLayout.class, params.getLayoutFactory().create());
36+
assertNotNull(params.getIdProviderFactory());
37+
assertInstanceOf(IntIdProvider.class, params.getIdProviderFactory().create());
38+
assertNotNull(params.getComponentLibrary());
39+
assertInstanceOf(DefaultComponentLibrary.class, params.getComponentLibrary());
40+
assertNotNull(params.getEdgeRouting());
41+
assertInstanceOf(StraightEdgeRouting.class, params.getEdgeRouting());
42+
}
43+
44+
@Test
45+
void testSettersAndGetters() {
46+
NadParameters params = new NadParameters();
47+
48+
SvgParameters svgParams = new SvgParameters();
49+
params.setSvgParameters(svgParams);
50+
assertSame(svgParams, params.getSvgParameters());
51+
52+
LayoutParameters layoutParams = new LayoutParameters();
53+
params.setLayoutParameters(layoutParams);
54+
assertSame(layoutParams, params.getLayoutParameters());
55+
56+
StyleProviderFactory styleFactory = network -> null;
57+
params.setStyleProviderFactory(styleFactory);
58+
assertSame(styleFactory, params.getStyleProviderFactory());
59+
60+
var edgeInfoParameters = new EdgeInfoParameters(
61+
EdgeInfoEnum.ACTIVE_POWER, EdgeInfoEnum.EMPTY, EdgeInfoEnum.CURRENT, EdgeInfoEnum.NAME);
62+
var labelProviderParameters = new LabelProviderParameters()
63+
.setEdgeInfoParameters(edgeInfoParameters);
64+
var labelFactory = new DefaultLabelProviderFactory(labelProviderParameters);
65+
params.setLabelProviderFactory(labelFactory);
66+
assertSame(labelFactory, params.getLabelProviderFactory());
67+
assertSame(labelProviderParameters, labelFactory.getParameters());
68+
assertSame(edgeInfoParameters, labelFactory.getParameters().getEdgeInfoParameters());
69+
Network network = Networks.createTwoVoltageLevels();
70+
var labelProvider = params.createLabelProvider(network);
71+
assertInstanceOf(DefaultLabelProvider.class, labelProvider);
72+
assertSame(labelProviderParameters, ((DefaultLabelProvider) labelProvider).getParameters());
73+
74+
LayoutFactory layoutFactory = () -> null;
75+
params.setLayoutFactory(layoutFactory);
76+
assertSame(layoutFactory, params.getLayoutFactory());
77+
78+
IdProviderFactory idFactory = () -> null;
79+
params.setIdProviderFactory(idFactory);
80+
assertSame(idFactory, params.getIdProviderFactory());
81+
82+
NadComponentLibrary lib = new DefaultComponentLibrary();
83+
params.setComponentLibrary(lib);
84+
assertSame(lib, params.getComponentLibrary());
85+
86+
EdgeRouting routing = new StraightEdgeRouting();
87+
params.setEdgeRouting(routing);
88+
assertSame(routing, params.getEdgeRouting());
89+
}
90+
91+
@Test
92+
void testCreateLabelProvider() {
93+
NadParameters params = new NadParameters();
94+
Network network = Networks.createTwoVoltageLevels();
95+
LabelProvider labelProvider = params.createLabelProvider(network);
96+
assertNotNull(labelProvider);
97+
assertInstanceOf(DefaultLabelProvider.class, labelProvider);
98+
}
99+
}

0 commit comments

Comments
 (0)