SecurityAnalysisExecutionBuilder.java

/**
 * Copyright (c) 2018, 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.security.execution;

import com.powsybl.contingency.ContingenciesProviders;
import com.powsybl.security.SecurityAnalysisInput;
import com.powsybl.security.distributed.DistributedSecurityAnalysisExecution;
import com.powsybl.security.distributed.ExternalSecurityAnalysisConfig;
import com.powsybl.security.distributed.ForwardedSecurityAnalysisExecution;

import java.util.Objects;
import java.util.function.Supplier;

/**
 * Helper class to build a {@link SecurityAnalysisExecution},
 * based on specified options, in particular distribution options.
 *
 * @author Sylvain Leclerc {@literal <sylvain.leclerc at rte-france.com>}
 */
public class SecurityAnalysisExecutionBuilder extends AbstractSecurityAnalysisExecutionBuilder<SecurityAnalysisExecutionBuilder> {

    private final SecurityAnalysisInputBuildStrategy inputBuildStrategy;

    /**
     * Create a new builder.
     *
     * @param externalConfig     The method to load an external security analysis config, only used for forwarded and distributed executions.
     * @param providerName       The named security-analysis implementation to use. If {@literal null}, the default would be used.
     * @param inputBuildStrategy The method to translates execution inputs into actual security analysis inputs. Only used for local executions.
     */
    public SecurityAnalysisExecutionBuilder(Supplier<ExternalSecurityAnalysisConfig> externalConfig,
                                            String providerName,
                                            SecurityAnalysisInputBuildStrategy inputBuildStrategy) {
        super(externalConfig, providerName);
        this.inputBuildStrategy = Objects.requireNonNull(inputBuildStrategy);
    }

    public SecurityAnalysisExecution build() {
        if (forward) {
            return new ForwardedSecurityAnalysisExecution(externalConfig.get(), taskCount);
        } else if (taskCount != null) {
            return new DistributedSecurityAnalysisExecution(externalConfig.get(), taskCount);
        } else {
            return new SecurityAnalysisExecutionImpl(providerName, inputBuildStrategy());
        }
    }

    private SecurityAnalysisInputBuildStrategy inputBuildStrategy() {
        return subPart != null ? subPartBuildStrategy() : inputBuildStrategy;
    }

    protected SecurityAnalysisInputBuildStrategy subPartBuildStrategy() {
        return executionInput -> {
            SecurityAnalysisInput input = inputBuildStrategy.buildFrom(executionInput);
            input.setContingencies(ContingenciesProviders.newSubProvider(input.getContingenciesProvider(), subPart));
            return input;
        };
    }

    @Override
    protected SecurityAnalysisExecutionBuilder self() {
        return this;
    }
}