NetworkActionAdderImpl.java

/*
 * Copyright (c) 2021, 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.openrao.data.crac.impl;

import com.powsybl.action.Action;
import com.powsybl.openrao.commons.OpenRaoException;
import com.powsybl.openrao.commons.logs.OpenRaoLoggerProvider;
import com.powsybl.openrao.data.crac.api.NetworkElement;
import com.powsybl.openrao.data.crac.api.networkaction.DanglingLineActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.GeneratorActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.LoadActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkAction;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.PhaseTapChangerTapPositionActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.ShuntCompensatorPositionActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.SwitchActionAdder;
import com.powsybl.openrao.data.crac.api.networkaction.SwitchPairAdder;
import com.powsybl.openrao.data.crac.api.networkaction.TerminalsConnectionActionAdder;

import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/**
 * @author Baptiste Seguinot {@literal <baptiste.seguinot at rte-france.com>}
 * @author Peter Mitri {@literal <peter.mitri at rte-france.com>}
 */
public class NetworkActionAdderImpl extends AbstractRemedialActionAdder<NetworkActionAdder> implements NetworkActionAdder {

    private Set<Action> elementaryActions;
    private Set<NetworkElement> networkElements;

    NetworkActionAdderImpl(CracImpl owner) {
        super(owner);
        this.elementaryActions = new HashSet<>();
        this.networkElements = new HashSet<>();
    }

    @Override
    protected String getTypeDescription() {
        return "NetworkAction";
    }

    @Override
    public TerminalsConnectionActionAdder newTerminalsConnectionAction() {
        return new TerminalsConnectionActionAdderImpl(this);
    }

    @Override
    public SwitchActionAdder newSwitchAction() {
        return new SwitchActionAdderImpl(this);
    }

    @Override
    public PhaseTapChangerTapPositionActionAdder newPhaseTapChangerTapPositionAction() {
        return new PhaseTapChangerTapPositionActionAdderImpl(this);
    }

    @Override
    public GeneratorActionAdder newGeneratorAction() {
        return new GeneratorActionAdderImpl(this);
    }

    @Override
    public LoadActionAdder newLoadAction() {
        return new LoadActionAdderImpl(this);
    }

    @Override
    public DanglingLineActionAdder newDanglingLineAction() {
        return new DanglingLineActionAdderImpl(this);
    }

    @Override
    public ShuntCompensatorPositionActionAdder newShuntCompensatorPositionAction() {
        return new ShuntCompensatorPositionActionAdderImpl(this);
    }

    @Override
    public SwitchPairAdder newSwitchPair() {
        return new SwitchPairAdderImpl(this);
    }

    @Override
    public NetworkAction add() {
        checkId();

        if (!Objects.isNull(getCrac().getRemedialAction(id))) {
            throw new OpenRaoException(String.format("A remedial action with id %s already exists", id));
        }
        if (usageRules.isEmpty()) {
            OpenRaoLoggerProvider.BUSINESS_WARNS.warn("NetworkAction {} does not contain any usage rule, by default it will never be available", id);
        }
        if (elementaryActions.isEmpty()) {
            throw new OpenRaoException(String.format("NetworkAction %s has to have at least one ElementaryAction.", id));
        }

        NetworkAction networkAction = new NetworkActionImpl(id, name, operator, usageRules, elementaryActions, speed, activationCost, networkElements);
        getCrac().addNetworkAction(networkAction);
        return networkAction;
    }

    void addElementaryAction(Action elementaryAction, NetworkElement... networkElements) {
        this.elementaryActions.add(elementaryAction);
        Collections.addAll(this.networkElements, networkElements);
    }
}