|
7 | 7 | package org.gridsuite.network.map.dto;
|
8 | 8 |
|
9 | 9 | import com.powsybl.iidm.network.*;
|
| 10 | +import lombok.Getter; |
| 11 | +import lombok.NonNull; |
10 | 12 | import org.gridsuite.network.map.dto.mapper.*;
|
| 13 | +import org.springframework.lang.Nullable; |
11 | 14 |
|
| 15 | +import java.util.Set; |
12 | 16 | import java.util.function.BiFunction;
|
13 |
| - |
| 17 | +import java.util.function.Function; |
| 18 | +import java.util.stream.Stream; |
14 | 19 |
|
15 | 20 | public enum ElementType {
|
16 |
| - SUBSTATION(Substation.class, SubstationInfosMapper::toData), |
17 |
| - VOLTAGE_LEVEL(VoltageLevel.class, VoltageLevelInfosMapper::toData), |
18 |
| - LINE(Line.class, LineInfosMapper::toData), |
19 |
| - TIE_LINE(TieLine.class, TieLineInfosMapper::toData), |
20 |
| - HVDC_LINE(HvdcLine.class, HvdcInfosMapper::toData), |
21 |
| - HVDC_LINE_LCC(HvdcLine.class, HvdcLccInfosMapper::toData), |
22 |
| - HVDC_LINE_VSC(HvdcLine.class, HvdcVscInfosMapper::toData), |
23 |
| - LOAD(Load.class, LoadInfosMapper::toData), |
24 |
| - TWO_WINDINGS_TRANSFORMER(TwoWindingsTransformer.class, TwoWindingsTransformerInfosMapper::toData), |
25 |
| - THREE_WINDINGS_TRANSFORMER(ThreeWindingsTransformer.class, ThreeWindingsTransformerInfosMapper::toData), |
26 |
| - BUSBAR_SECTION(BusbarSection.class, BusBarSectionInfosMapper::toData), |
27 |
| - BUS(Bus.class, BusInfosMapper::toData), |
28 |
| - GENERATOR(Generator.class, GeneratorInfosMapper::toData), |
29 |
| - BATTERY(Battery.class, BatteryInfosMapper::toData), |
30 |
| - SHUNT_COMPENSATOR(ShuntCompensator.class, ShuntCompensatorMapper::toData), |
31 |
| - DANGLING_LINE(DanglingLine.class, DanglingLineInfosMapper::toData), |
32 |
| - STATIC_VAR_COMPENSATOR(StaticVarCompensator.class, StaticVarCompensatorInfosMapper::toData), |
33 |
| - LCC_CONVERTER_STATION(LccConverterStation.class, LccConverterStationInfosMapper::toData), |
34 |
| - VSC_CONVERTER_STATION(VscConverterStation.class, VscConverterStationInfosMapper::toData); |
35 |
| - |
36 |
| - private final Class<? extends Identifiable> elementClass; |
37 |
| - |
38 |
| - private final BiFunction<Identifiable<?>, InfoTypeParameters, ElementInfos> infosGetter; |
39 |
| - |
40 |
| - public Class<? extends Identifiable> getElementClass() { |
41 |
| - return elementClass; |
| 21 | + SUBSTATION(Substation.class, SubstationInfosMapper::toData, null), |
| 22 | + VOLTAGE_LEVEL(VoltageLevel.class, VoltageLevelInfosMapper::toData, null), |
| 23 | + BRANCH(Branch.class, BranchInfosMapper::toData, |
| 24 | + network -> Stream.concat(network.getLineStream(), network.getTwoWindingsTransformerStream()), |
| 25 | + Line.class, TwoWindingsTransformer.class), |
| 26 | + LINE(Line.class, LineInfosMapper::toData, Network::getLineStream), |
| 27 | + TIE_LINE(TieLine.class, TieLineInfosMapper::toData, null), |
| 28 | + HVDC_LINE(HvdcLine.class, HvdcInfosMapper::toData, null), |
| 29 | + HVDC_LINE_LCC(HvdcLine.class, HvdcLccInfosMapper::toData, null), |
| 30 | + HVDC_LINE_VSC(HvdcLine.class, HvdcVscInfosMapper::toData, null), |
| 31 | + LOAD(Load.class, LoadInfosMapper::toData, Network::getLoadStream), |
| 32 | + TWO_WINDINGS_TRANSFORMER(TwoWindingsTransformer.class, TwoWindingsTransformerInfosMapper::toData, Network::getTwoWindingsTransformerStream), |
| 33 | + THREE_WINDINGS_TRANSFORMER(ThreeWindingsTransformer.class, ThreeWindingsTransformerInfosMapper::toData, Network::getThreeWindingsTransformerStream), |
| 34 | + BUSBAR_SECTION(BusbarSection.class, BusBarSectionInfosMapper::toData, Network::getBusbarSectionStream), |
| 35 | + BUS(Bus.class, BusInfosMapper::toData, Network::getBusbarSectionStream), |
| 36 | + GENERATOR(Generator.class, GeneratorInfosMapper::toData, Network::getGeneratorStream), |
| 37 | + BATTERY(Battery.class, BatteryInfosMapper::toData, Network::getBatteryStream), |
| 38 | + SHUNT_COMPENSATOR(ShuntCompensator.class, ShuntCompensatorMapper::toData, Network::getShuntCompensatorStream), |
| 39 | + DANGLING_LINE(DanglingLine.class, DanglingLineInfosMapper::toData, Network::getDanglingLineStream), |
| 40 | + STATIC_VAR_COMPENSATOR(StaticVarCompensator.class, StaticVarCompensatorInfosMapper::toData, Network::getStaticVarCompensatorStream), |
| 41 | + LCC_CONVERTER_STATION(LccConverterStation.class, LccConverterStationInfosMapper::toData, Network::getLccConverterStationStream), |
| 42 | + VSC_CONVERTER_STATION(VscConverterStation.class, VscConverterStationInfosMapper::toData, Network::getVscConverterStationStream); |
| 43 | + |
| 44 | + /** |
| 45 | + * @since 2.22.0 |
| 46 | + * @apiNote Is {@code null} if it's not a concrete class. |
| 47 | + */ |
| 48 | + @NonNull private final Class<? extends Identifiable<?>> elementClass; |
| 49 | + |
| 50 | + /** |
| 51 | + * For composed element classes |
| 52 | + * @since 2.22.0 |
| 53 | + */ |
| 54 | + @Nullable private final Set<Class<? extends Identifiable<?>>> subClasses; |
| 55 | + |
| 56 | + /** |
| 57 | + * Is {@link #elementClass}, or all {@link #subClasses} if present, is an instance of {@link Connectable}? |
| 58 | + * @apiNote Is only to not have to do the test each time the information is needed. |
| 59 | + * @since 2.22.0 |
| 60 | + */ |
| 61 | + @Getter final boolean isConnectable; |
| 62 | + |
| 63 | + /** |
| 64 | + * {@code toData()} function from the mapper |
| 65 | + */ |
| 66 | + @Getter @NonNull |
| 67 | + private final BiFunction</*? extends*/ Identifiable<?>, InfoTypeParameters, ElementInfos> infosGetter; |
| 68 | + |
| 69 | + /** |
| 70 | + * @since 2.22.0 |
| 71 | + */ |
| 72 | + @NonNull |
| 73 | + private final Function<Network, Stream</*? extends*/ Connectable<?>>> connectableStream; |
| 74 | + |
| 75 | + @SafeVarargs |
| 76 | + <T extends Identifiable<T>> ElementType( |
| 77 | + @NonNull final Class<T> typeClass, |
| 78 | + @NonNull final BiFunction<T, InfoTypeParameters, ElementInfos> dataGetter, |
| 79 | + @Nullable final Function<Network, Stream</*T*/ ? extends Connectable<?>>> connectableStream, |
| 80 | + @Nullable final Class</*? extends T*/? extends Identifiable<?>>... subTypes) { |
| 81 | + this.connectableStream = connectableStream != null ? ((Function<Network, Stream<Connectable<?>>>) (Object) connectableStream) : (n -> { |
| 82 | + throw new IllegalStateException("Unexpected connectable type:" + this); |
| 83 | + }); |
| 84 | + this.elementClass = typeClass; |
| 85 | + //noinspection unchecked |
| 86 | + this.infosGetter = (BiFunction<Identifiable<?>, InfoTypeParameters, ElementInfos>) dataGetter; |
| 87 | + if (subTypes != null && subTypes.length > 0) { |
| 88 | + this.subClasses = Set.of(subTypes); |
| 89 | + if (subClasses.stream().anyMatch(subType -> !typeClass.isAssignableFrom(subType))) { |
| 90 | + // typing the list as Class<? extends T> to check during compile-time don't work, so let's at least check during class loading |
| 91 | + throw new VerifyError("Not all sub-classes extends base class"); |
| 92 | + } |
| 93 | + this.isConnectable = subClasses.stream().allMatch(Connectable.class::isAssignableFrom); |
| 94 | + } else { |
| 95 | + this.subClasses = null; |
| 96 | + this.isConnectable = Connectable.class.isAssignableFrom(this.elementClass); |
| 97 | + } |
42 | 98 | }
|
43 | 99 |
|
44 |
| - public BiFunction<Identifiable<?>, InfoTypeParameters, ElementInfos> getInfosGetter() { |
45 |
| - return infosGetter; |
| 100 | + public Stream<Connectable<?>> getVoltageLevelConnectableStream(@NonNull final VoltageLevel voltageLevel) { |
| 101 | + if (!this.isConnectable) { |
| 102 | + throw new UnsupportedOperationException("This element type is not a connectable type"); |
| 103 | + } |
| 104 | + if (this.subClasses == null) { |
| 105 | + return voltageLevel.getConnectableStream((Class<Connectable<?>>) this.elementClass); |
| 106 | + } else { |
| 107 | + return this.subClasses.stream() |
| 108 | + .map(c -> (Class<? extends Connectable<?>>) c) |
| 109 | + .flatMap(voltageLevel::getConnectableStream); |
| 110 | + } |
46 | 111 | }
|
47 | 112 |
|
48 |
| - ElementType(Class<? extends Identifiable> typeClass, BiFunction<Identifiable<?>, InfoTypeParameters, ElementInfos> dataGetter) { |
49 |
| - this.elementClass = typeClass; |
50 |
| - this.infosGetter = dataGetter; |
| 113 | + public Stream<Connectable<?>> getConnectableStream(final Network network) { |
| 114 | + return this.connectableStream.apply(network); |
51 | 115 | }
|
52 | 116 | }
|
53 |
| - |
|
0 commit comments