DefaultModelsHandler.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/.
 */
package com.powsybl.dynawo.models.defaultmodels;

import com.powsybl.commons.PowsyblException;
import com.powsybl.dynawo.models.Model;
import com.powsybl.iidm.network.Identifiable;
import com.powsybl.iidm.network.IdentifiableType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.EnumSet;
import java.util.List;
import java.util.Map;

import static java.util.stream.Collectors.groupingBy;

/**
 * @author Florian Dupuy {@literal <florian.dupuy at rte-france.com>}
 * @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
 */
public final class DefaultModelsHandler {

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

    private static final Map<IdentifiableType, List<DefaultModelConfiguration>> CONFIGURATIONS = EnumSet.allOf(DefaultModelConfiguration.class)
            .stream()
            .collect(groupingBy(DefaultModelConfiguration::getIdentifiableType));

    public <T extends Model> T getDefaultModel(Identifiable<?> equipment, Class<T> connectableClass, boolean throwException) {
        DefaultModelConfiguration conf = findConfiguration(equipment.getType(), connectableClass);
        Model defaultModel = conf.getDefaultModel(equipment.getId());
        if (connectableClass.isInstance(defaultModel)) {
            return connectableClass.cast(defaultModel);
        }
        if (throwException) {
            throw new PowsyblException("Default model " + defaultModel.getClass().getSimpleName() + " for " + equipment.getId() + " does not implement " + connectableClass.getSimpleName() + " interface");
        } else {
            LOGGER.warn("Default model {} for {} does not implement {} interface", defaultModel.getClass().getSimpleName(), equipment.getId(), connectableClass.getSimpleName());
            return null;
        }
    }

    private <T extends Model> DefaultModelConfiguration findConfiguration(IdentifiableType type, Class<T> connectableClass) {
        List<DefaultModelConfiguration> configurationList = CONFIGURATIONS.get(type);
        if (configurationList == null) {
            throw new PowsyblException("No default model configuration for " + type);
        }
        if (configurationList.size() == 1) {
            return configurationList.get(0);
        } else {
            for (DefaultModelConfiguration configuration : configurationList) {
                if (connectableClass.isAssignableFrom(configuration.getEquipmentClass())) {
                    return configuration;
                }
            }
            throw new PowsyblException("No default model configuration for " + type + " - " + connectableClass.getSimpleName());
        }
    }
}