AbstractHvdcBuilder.java

/**
 * Copyright (c) 2023, 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/.
 * SPDX-License-Identifier: MPL-2.0
 */
package com.powsybl.dynawo.models.hvdc;

import com.powsybl.commons.report.ReportNode;
import com.powsybl.dynawo.builders.AbstractEquipmentModelBuilder;
import com.powsybl.dynawo.builders.ModelConfig;
import com.powsybl.dynawo.builders.BuilderReports;
import com.powsybl.iidm.network.*;

/**
 * @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
 */
public abstract class AbstractHvdcBuilder<R extends AbstractEquipmentModelBuilder<HvdcLine, R>> extends AbstractEquipmentModelBuilder<HvdcLine, R> {

    protected static final TwoSides DEFAULT_DANGLING_SIDE = TwoSides.TWO;

    protected TwoSides danglingSide;
    protected final HvdcVarNameHandler varNameHandler;

    protected AbstractHvdcBuilder(Network network, ModelConfig modelConfig, IdentifiableType identifiableType,
                                  ReportNode reportNode, HvdcVarNameHandler varNameHandler) {
        super(network, modelConfig, identifiableType, reportNode);
        this.varNameHandler = varNameHandler;
    }

    protected AbstractHvdcBuilder(Network network, ModelConfig modelConfig, String equipmentType, ReportNode reportNode,
                                  HvdcVarNameHandler varNameHandler) {
        super(network, modelConfig, equipmentType, reportNode);
        this.varNameHandler = varNameHandler;
    }

    public R dangling(TwoSides danglingSide) {
        this.danglingSide = danglingSide;
        return self();
    }

    @Override
    protected void checkData() {
        super.checkData();
        boolean isDangling = modelConfig.isDangling();
        if (isDangling && danglingSide != null) {
            BuilderReports.reportFieldOptionNotImplemented(reportNode, "dangling", DEFAULT_DANGLING_SIDE.toString());
        } else if (!isDangling && danglingSide != null) {
            BuilderReports.reportFieldSetWithWrongEquipment(reportNode, "dangling", modelConfig.lib());
            isInstantiable = false;
        }
    }

    @Override
    public BaseHvdc build() {
        if (isInstantiable()) {
            if (modelConfig.isDangling()) {
                return new HvdcDangling(getEquipment(), parameterSetId, modelConfig, varNameHandler, DEFAULT_DANGLING_SIDE);
            } else {
                return new BaseHvdc(getEquipment(), parameterSetId, modelConfig, varNameHandler);
            }
        }
        return null;
    }
}