DynawoOutputVariablesBuilder.java

/**
 * Copyright (c) 2024, 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.dynawo.outputvariables;

import com.powsybl.commons.report.ReportNode;
import com.powsybl.dynamicsimulation.OutputVariable;
import com.powsybl.dynawo.builders.BuilderReports;

import java.util.*;
import java.util.function.Consumer;

/**
 * An output variable for <pre>Dynawo</pre> can be defined using {@code staticId} and {@code variable} or {@code dynamicModelId} and {@code variable}.
 * Definition with {@code staticId} and {@code variable} are used when no explicit dynamic component exists.
 * <pre>Dynawo</pre> expects {@code dynamicModelId} = ���NETWORK��� for these variables.
 * @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
 */
public class DynawoOutputVariablesBuilder {

    private static final String DEFAULT_DYNAMIC_MODEL_ID = "NETWORK";

    private final ReportNode reportNode;
    private boolean isInstantiable = true;
    private String dynamicModelId;
    private String staticId;
    private List<String> variables;
    private OutputVariable.OutputType type = OutputVariable.OutputType.CURVE;

    public DynawoOutputVariablesBuilder(ReportNode reportNode) {
        this.reportNode = reportNode;
    }

    public DynawoOutputVariablesBuilder() {
        this(ReportNode.NO_OP);
    }

    public DynawoOutputVariablesBuilder dynamicModelId(String dynamicModelId) {
        this.dynamicModelId = dynamicModelId;
        return this;
    }

    public DynawoOutputVariablesBuilder staticId(String staticId) {
        this.staticId = staticId;
        return this;
    }

    public DynawoOutputVariablesBuilder variables(String... variables) {
        this.variables = List.of(variables);
        return this;
    }

    public DynawoOutputVariablesBuilder variables(List<String> variables) {
        this.variables = variables;
        return this;
    }

    public DynawoOutputVariablesBuilder variable(String variable) {
        this.variables = List.of(variable);
        return this;
    }

    public DynawoOutputVariablesBuilder outputType(OutputVariable.OutputType type) {
        this.type = type;
        return this;
    }

    private String getId() {
        return dynamicModelId != null ? dynamicModelId : staticId;
    }

    private void checkData() {
        if (staticId != null && dynamicModelId != null) {
            BuilderReports.reportFieldConflict(reportNode, "dynamicModelId", "staticId");
        }
        if (variables == null) {
            BuilderReports.reportFieldNotSet(reportNode, "variables");
            isInstantiable = false;
        } else if (variables.isEmpty()) {
            BuilderReports.reportEmptyList(reportNode, "variables");
            isInstantiable = false;
        }
    }

    private boolean isInstantiable() {
        checkData();
        if (!isInstantiable) {
            BuilderReports.reportOutputVariableInstantiationFailure(reportNode, getId());
        }
        return isInstantiable;
    }

    public void add(Consumer<OutputVariable> outputVariableConsumer) {
        if (isInstantiable()) {
            boolean hasDynamicModelId = dynamicModelId != null;
            String id = hasDynamicModelId ? dynamicModelId : DEFAULT_DYNAMIC_MODEL_ID;
            variables.forEach(v ->
                    outputVariableConsumer.accept(new DynawoOutputVariable(id, hasDynamicModelId ? v : staticId + "_" + v, type)));
        }
    }

    public List<OutputVariable> build() {
        List<OutputVariable> outputVariables = new ArrayList<>();
        add(outputVariables::add);
        return outputVariables;
    }
}