ZonalDataFromGlskDocument.java

/*
 * Copyright (c) 2020, 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/.
 */

package com.powsybl.glsk.api.util;

import com.powsybl.glsk.api.GlskPoint;
import com.powsybl.glsk.commons.ZonalDataImpl;
import com.powsybl.glsk.api.GlskDocument;
import com.powsybl.glsk.commons.GlskException;
import com.powsybl.glsk.api.util.converters.GlskPointToLinearDataConverter;
import com.powsybl.iidm.network.Network;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.Instant;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Joris Mancini {@literal <joris.mancini at rte-france.com>}
 */
public class ZonalDataFromGlskDocument<I> extends ZonalDataImpl<I> {
    private static final Logger LOGGER = LoggerFactory.getLogger(ZonalDataFromGlskDocument.class);

    public ZonalDataFromGlskDocument(GlskDocument glskDocument, Network network, GlskPointToLinearDataConverter<I> converter, Instant instant) {
        super(new HashMap<>());
        for (String zone : glskDocument.getZones()) {
            List<GlskPoint> glskPointList = glskDocument.getGlskPoints(zone).stream()
                .filter(glskPoint -> glskPoint.getPointInterval().contains(instant))
                .collect(Collectors.toList());
            try {
                addLinearDataFromList(network, converter, glskPointList, zone);
            } catch (GlskException e) {
                LOGGER.warn(String.format("Could not create linear data for zone %s: %s", zone, e.getMessage()));
            }
        }
    }

    public ZonalDataFromGlskDocument(GlskDocument glskDocument, Network network, GlskPointToLinearDataConverter<I> converter) {
        super(new HashMap<>());
        for (String zone : glskDocument.getZones()) {
            List<GlskPoint> glskPointList = glskDocument.getGlskPoints(zone);
            addLinearDataFromList(network, converter, glskPointList, zone);
        }
    }

    private void addLinearDataFromList(Network network, GlskPointToLinearDataConverter<I> converter, List<GlskPoint> glskPointList, String country) {
        if (glskPointList.size() > 1) {
            throw new GlskException("Cannot instantiate simple linear data because several glsk point match given instant");
        } else if (!glskPointList.isEmpty()) {
            I linearData = converter.convert(network, glskPointList.get(0));
            dataPerZone.put(country, linearData);
        }
    }
}