LfNetworkList.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.openloadflow.network.impl;

import com.powsybl.iidm.network.Network;
import com.powsybl.openloadflow.network.LfNetwork;

import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */
public class LfNetworkList implements AutoCloseable {

    public interface VariantCleaner {

        String getTmpVariantId();

        void clean();
    }

    public abstract static class AbstractVariantCleaner implements VariantCleaner {

        protected final Network network;

        protected final String workingVariantId;

        protected final String tmpVariantId;

        protected AbstractVariantCleaner(Network network, String workingVariantId, String tmpVariantId) {
            this.network = Objects.requireNonNull(network);
            this.workingVariantId = Objects.requireNonNull(workingVariantId);
            this.tmpVariantId = Objects.requireNonNull(tmpVariantId);
        }

        @Override
        public String getTmpVariantId() {
            return tmpVariantId;
        }
    }

    public static class DefaultVariantCleaner extends AbstractVariantCleaner {

        public DefaultVariantCleaner(Network network, String workingVariantId, String tmpVariantId) {
            super(network, workingVariantId, tmpVariantId);
        }

        @Override
        public void clean() {
            network.getVariantManager().removeVariant(tmpVariantId);
            network.getVariantManager().setWorkingVariant(workingVariantId);
        }
    }

    public static class WorkingVariantReverter extends AbstractVariantCleaner {

        public WorkingVariantReverter(Network network, String workingVariantId, String tmpVariantId) {
            super(network, workingVariantId, tmpVariantId);
        }

        @Override
        public void clean() {
            network.getVariantManager().setWorkingVariant(workingVariantId);
        }
    }

    @FunctionalInterface
    public interface VariantCleanerFactory {
        VariantCleaner create(Network network, String workingVariantId, String tmpVariantId);
    }

    // list of networks sorted by descending size
    private final List<LfNetwork> list;

    private final VariantCleaner variantCleaner;

    public LfNetworkList(List<LfNetwork> list, VariantCleaner variantCleaner) {
        this.list = Objects.requireNonNull(list);
        this.variantCleaner = variantCleaner;
    }

    public LfNetworkList(List<LfNetwork> list) {
        this(list, null);
    }

    public List<LfNetwork> getList() {
        return list;
    }

    public Optional<LfNetwork> getLargest() {
        return list.isEmpty() ? Optional.empty() : Optional.of(list.get(0));
    }

    @Override
    public void close() {
        if (variantCleaner != null) {
            variantCleaner.clean();
        }
    }

    public VariantCleaner getVariantCleaner() {
        return variantCleaner;
    }
}