RawGraphBuilder.java

/**
 * Copyright (c) 2020, RTE (http://www.rte-france.com)
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package com.powsybl.sld.builders;

import com.powsybl.sld.model.graphs.*;

import java.util.*;

/**
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */

public class RawGraphBuilder implements GraphBuilder {

    private final Map<String, VoltageLevelRawBuilder> vlBuilders = new TreeMap<>();
    private final Map<String, SubstationRawBuilder> ssBuilders = new TreeMap<>();

    private ZoneRawBuilder zBuilder;

    public VoltageLevelRawBuilder createVoltageLevelBuilder(VoltageLevelInfos voltageLevelInfos, SubstationRawBuilder parentBuilder) {
        VoltageLevelRawBuilder vlBuilder = new VoltageLevelRawBuilder(voltageLevelInfos, parentBuilder, this::getVoltageLevelInfosFromId);
        if (parentBuilder != null) {
            parentBuilder.addVlBuilder(vlBuilder);
        }
        vlBuilders.put(voltageLevelInfos.getId(), vlBuilder);
        return vlBuilder;
    }

    public VoltageLevelRawBuilder createVoltageLevelBuilder(String vlId, double vlNominalV, SubstationRawBuilder parentBuilder) {
        return createVoltageLevelBuilder(new VoltageLevelInfos(vlId, vlId, vlNominalV), parentBuilder);
    }

    public VoltageLevelRawBuilder createVoltageLevelBuilder(String vlId, double vlNominalV) {
        return createVoltageLevelBuilder(vlId, vlNominalV, null);
    }

    public VoltageLevelInfos getVoltageLevelInfosFromId(String id) {
        if (vlBuilders.containsKey(id)) {
            return vlBuilders.get(id).getVoltageLevelInfos();
        }
        return new VoltageLevelInfos("OTHER", "OTHER", 0);
    }

    public SubstationRawBuilder createSubstationBuilder(String id, ZoneRawBuilder parentBuilder) {
        SubstationRawBuilder ssb = new SubstationRawBuilder(id, parentBuilder);
        if (parentBuilder != null) {
            parentBuilder.addSubstationBuilder(ssb);
        }
        ssBuilders.put(id, ssb);
        return ssb;
    }

    public SubstationRawBuilder createSubstationBuilder(String id) {
        return createSubstationBuilder(id, null);
    }

    public ZoneRawBuilder createZoneBuilder(List<String> substationIds) {
        zBuilder = new ZoneRawBuilder(substationIds);
        return zBuilder;
    }

    @Override
    public VoltageLevelGraph buildVoltageLevelGraph(String id, Graph parentGraph) {
        return vlBuilders.get(id).getGraph();
    }

    @Override
    public VoltageLevelGraph buildVoltageLevelGraph(String id) {
        return buildVoltageLevelGraph(id, null);
    }

    @Override
    public SubstationGraph buildSubstationGraph(String id, ZoneGraph parentGraph) {
        SubstationRawBuilder sGraphBuilder = ssBuilders.get(id);
        SubstationGraph ssGraph = sGraphBuilder.getGraph();
        sGraphBuilder.voltageLevelBuilders.stream()
                .map(VoltageLevelRawBuilder::getGraph)
                .sorted(Comparator.comparingDouble(vlGraph -> -vlGraph.getVoltageLevelInfos().getNominalVoltage()))
                .forEach(ssGraph::addVoltageLevel);
        if (parentGraph != null) {
            parentGraph.addSubstation(ssGraph);
        }
        return ssGraph;
    }

    @Override
    public SubstationGraph buildSubstationGraph(String id) {
        return buildSubstationGraph(id, null);
    }

    @Override
    public ZoneGraph buildZoneGraph(List<String> substationIds) {
        ZoneRawBuilder zGraphBuilder = zBuilder;
        ZoneGraph zGraph = zGraphBuilder.getGraph();
        substationIds.forEach(id -> buildSubstationGraph(id, zGraph));
        return zGraph;
    }
}