VoltageAngleLimitSerDe.java

/**
 * Copyright (c) 2023, 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.iidm.serde;

import com.powsybl.commons.PowsyblException;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.Terminal;
import com.powsybl.iidm.network.VoltageAngleLimit;
import com.powsybl.iidm.network.VoltageAngleLimitAdder;
import com.powsybl.iidm.serde.util.IidmSerDeUtil;

import java.util.OptionalDouble;

/**
 *
 * @author Luma Zamarre��o {@literal <zamarrenolm at aia.es>}
 * @author Jos�� Antonio Marqu��s {@literal <marquesja at aia.es>}
 */
public final class VoltageAngleLimitSerDe {

    static final String ROOT_ELEMENT_NAME = "voltageAngleLimit";
    static final String ARRAY_ELEMENT_NAME = "voltageAngleLimits";
    private static final String ID = "id";
    private static final String LOW_LIMIT = "lowLimit";
    private static final String HIGH_LIMIT = "highLimit";
    private static final String FROM = "from";
    private static final String TO = "to";

    public static void write(VoltageAngleLimit voltageAngleLimit, NetworkSerializerContext context) {
        IidmSerDeUtil.runFromMinimumVersion(IidmVersion.V_1_11, context, () -> {
            context.getWriter().writeStartNode(context.getVersion().getNamespaceURI(context.isValid()), ROOT_ELEMENT_NAME);
            context.getWriter().writeStringAttribute(ID, context.getAnonymizer().anonymizeString(voltageAngleLimit.getId()));

            OptionalDouble lowLimit = voltageAngleLimit.getLowLimit();
            OptionalDouble highLimit = voltageAngleLimit.getHighLimit();
            context.getWriter().writeOptionalDoubleAttribute(LOW_LIMIT, lowLimit.isPresent() ? lowLimit.getAsDouble() : null);
            context.getWriter().writeOptionalDoubleAttribute(HIGH_LIMIT, highLimit.isPresent() ? highLimit.getAsDouble() : null);

            TerminalRefSerDe.writeTerminalRef(voltageAngleLimit.getTerminalFrom(), context, FROM);
            TerminalRefSerDe.writeTerminalRef(voltageAngleLimit.getTerminalTo(), context, TO);
            context.getWriter().writeEndNode();
        });
    }

    public static void read(Network network, NetworkDeserializerContext context) {
        IidmSerDeUtil.runFromMinimumVersion(IidmVersion.V_1_11, context, () -> {

            String id = context.getAnonymizer().deanonymizeString(context.getReader().readStringAttribute(ID));
            OptionalDouble lowLimit = context.getReader().readOptionalDoubleAttribute(LOW_LIMIT);
            OptionalDouble highLimit = context.getReader().readOptionalDoubleAttribute(HIGH_LIMIT);

            VoltageAngleLimitAdder adder = network.newVoltageAngleLimit();
            adder.setId(id);
            lowLimit.ifPresent(adder::setLowLimit);
            highLimit.ifPresent(adder::setHighLimit);
            context.getReader().readChildNodes(elementName -> {
                Terminal terminal = TerminalRefSerDe.readTerminal(context, network);
                switch (elementName) {
                    case FROM -> adder.from(terminal);
                    case TO -> adder.to(terminal);
                    default -> throw new PowsyblException("Unknown element name '" + elementName + "' in 'voltageAngleLimit'");
                }
            });

            adder.add();
        });
    }

    private VoltageAngleLimitSerDe() {
    }
}