BaseVoltageMappingImpl.java

/**
 * Copyright (c) 2022, 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.cgmes.extensions;

import com.powsybl.commons.extensions.AbstractExtension;
import com.powsybl.iidm.network.Network;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

/**
 * @author Miora Vedelago {@literal <miora.ralambotiana at rte-france.com>}
 */
class BaseVoltageMappingImpl extends AbstractExtension<Network> implements BaseVoltageMapping {

    static class BaseVoltageSourceImpl implements BaseVoltageSource {
        private final String id;
        private final double nominalV;
        private final Source source;

        BaseVoltageSourceImpl(String id, double nominalV, Source source) {
            this.id = Objects.requireNonNull(id);
            this.nominalV = nominalV;
            this.source = Objects.requireNonNull(source);
        }

        public String getId() {
            return id;
        }

        public double getNominalV() {
            return nominalV;
        }

        public Source getSource() {
            return source;
        }
    }

    private static final Logger LOGGER = LoggerFactory.getLogger(BaseVoltageMappingImpl.class);

    private final Map<Double, BaseVoltageSource> nominalVoltageBaseVoltageMap = new HashMap<>();

    BaseVoltageMappingImpl(Set<BaseVoltageSource> baseVoltages) {
        baseVoltages.forEach(bvs -> {
            Objects.requireNonNull(bvs);
            addBaseVoltage(bvs.getNominalV(), bvs.getId(), bvs.getSource());
        });
    }

    @Override
    public Map<Double, BaseVoltageSource> getBaseVoltages() {
        return Collections.unmodifiableMap(nominalVoltageBaseVoltageMap);
    }

    @Override
    public BaseVoltageSource getBaseVoltage(double nominalVoltage) {
        return nominalVoltageBaseVoltageMap.get(nominalVoltage);
    }

    @Override
    public boolean isBaseVoltageMapped(double nominalVoltage) {
        return nominalVoltageBaseVoltageMap.containsKey(nominalVoltage);
    }

    @Override
    public boolean isBaseVoltageEmpty() {
        return nominalVoltageBaseVoltageMap.isEmpty();
    }

    @Override
    public BaseVoltageMapping addBaseVoltage(double nominalVoltage, String baseVoltageId, Source source) {
        if (nominalVoltageBaseVoltageMap.containsKey(nominalVoltage)) {
            if (nominalVoltageBaseVoltageMap.get(nominalVoltage).getSource().equals(Source.IGM) && source.equals(Source.BOUNDARY)) {
                if (LOGGER.isInfoEnabled()) {
                    LOGGER.info("Nominal voltage {} is already mapped with an {} base voltage. Replaced by a {} base voltage", nominalVoltage, Source.IGM.name(), Source.BOUNDARY.name());
                }
                nominalVoltageBaseVoltageMap.put(nominalVoltage, new BaseVoltageSourceImpl(baseVoltageId, nominalVoltage, source));
            } else {
                if (LOGGER.isInfoEnabled()) {
                    LOGGER.info("Nominal voltage {} is already mapped and not to the given base voltage {} from {}", nominalVoltage, baseVoltageId, source.name());
                }
            }
        } else {
            nominalVoltageBaseVoltageMap.put(nominalVoltage, new BaseVoltageSourceImpl(baseVoltageId, nominalVoltage, source));
        }
        return this;
    }

    @Override
    public Map<Double, BaseVoltageSource> baseVoltagesByNominalVoltageMap() {
        return new HashMap<>(nominalVoltageBaseVoltageMap);
    }
}