TerminalMockSerDe.java

/**
 * Copyright (c) 2019, 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.google.auto.service.AutoService;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedSet;
import com.powsybl.commons.extensions.ExtensionSerDe;
import com.powsybl.commons.io.DeserializerContext;
import com.powsybl.commons.io.SerializerContext;
import com.powsybl.iidm.network.Load;
import com.powsybl.iidm.network.test.TerminalMockExt;
import com.powsybl.iidm.serde.extensions.AbstractVersionableNetworkExtensionSerDe;

import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import static com.powsybl.iidm.serde.AbstractIidmSerDeTest.getVersionDir;
import static com.powsybl.iidm.serde.IidmSerDeConstants.CURRENT_IIDM_VERSION;

/**
 * @author Miora Ralambotiana {@literal <miora.ralambotiana at rte-france.com>}
 */
@AutoService(ExtensionSerDe.class)
public class TerminalMockSerDe extends AbstractVersionableNetworkExtensionSerDe<Load, TerminalMockExt> {

    public TerminalMockSerDe() {
        super("terminalMock", TerminalMockExt.class, "mock",
                ImmutableMap.<IidmVersion, ImmutableSortedSet<String>>builder()
                        .put(IidmVersion.V_1_0, ImmutableSortedSet.of("1.0"))
                        .put(IidmVersion.V_1_1, ImmutableSortedSet.of("1.1"))
                        .put(IidmVersion.V_1_2, ImmutableSortedSet.of("1.2"))
                        .put(IidmVersion.V_1_3, ImmutableSortedSet.of("1.3"))
                        .put(IidmVersion.V_1_4, ImmutableSortedSet.of("1.4"))
                        .put(IidmVersion.V_1_5, ImmutableSortedSet.of("1.5"))
                        .put(IidmVersion.V_1_6, ImmutableSortedSet.of("1.6"))
                        .put(IidmVersion.V_1_7, ImmutableSortedSet.of("1.7"))
                        .put(IidmVersion.V_1_8, ImmutableSortedSet.of("1.8"))
                        .put(IidmVersion.V_1_9, ImmutableSortedSet.of("1.9"))
                        .put(IidmVersion.V_1_10, ImmutableSortedSet.of("1.10"))
                        .put(IidmVersion.V_1_11, ImmutableSortedSet.of("1.11"))
                        .put(IidmVersion.V_1_12, ImmutableSortedSet.of("1.12"))
                        .put(IidmVersion.V_1_13, ImmutableSortedSet.of("1.13"))
                        .build(),
                ImmutableMap.<String, String>builder()
                        .put("1.0", "http://www.itesla_project.eu/schema/iidm/ext/terminal_mock/1_0")
                        .put("1.1", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_1")
                        .put("1.2", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_2")
                        .put("1.3", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_3")
                        .put("1.4", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_4")
                        .put("1.5", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_5")
                        .put("1.6", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_6")
                        .put("1.7", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_7")
                        .put("1.8", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_8")
                        .put("1.9", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_9")
                        .put("1.10", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_10")
                        .put("1.11", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_11")
                        .put("1.12", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_12")
                        .put("1.13", "http://www.powsybl.org/schema/iidm/ext/terminal_mock/1_13")
                        .build());
    }

    @Override
    public InputStream getXsdAsStream() {
        return getClass().getResourceAsStream(getVersionDir(CURRENT_IIDM_VERSION) + "xsd/terminalMock.xsd");
    }

    @Override
    public List<InputStream> getXsdAsStreamList() {
        return Arrays.stream(IidmVersion.values())
                .map(v -> getClass().getResourceAsStream(getVersionDir(v) + "xsd/terminalMock.xsd"))
                .collect(Collectors.toList());
    }

    @Override
    public void write(TerminalMockExt extension, SerializerContext context) {
        NetworkSerializerContext networkContext = (NetworkSerializerContext) context;
        String extensionVersion = networkContext.getOptions().getExtensionVersion(getExtensionName())
                .orElseGet(() -> getVersion(networkContext.getVersion()));
        TerminalRefSerDe.writeTerminalRef(extension.getTerminal(), networkContext, getNamespaceUri(extensionVersion), "terminal", context.getWriter());
    }

    @Override
    public TerminalMockExt read(Load load, DeserializerContext context) {
        NetworkDeserializerContext networkContext = (NetworkDeserializerContext) context;
        checkReadingCompatibility(networkContext);

        TerminalMockExt terminalMockExt = new TerminalMockExt(load);
        context.getReader().readChildNodes(elementName -> {
            if (elementName.equals("terminal")) {
                TerminalRefSerDe.readTerminalRef(networkContext, load.getNetwork(), terminalMockExt::setTerminal);
            } else {
                throw new IllegalStateException("Unexpected element: " + elementName);
            }
        });
        load.addExtension(TerminalMockExt.class, terminalMockExt);
        return terminalMockExt;
    }
}