ZonalDataChronologyFromGlskDocument.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.ZonalData;
import com.powsybl.glsk.commons.ZonalDataChronology;
import com.powsybl.glsk.commons.ZonalDataImpl;
import com.powsybl.glsk.commons.chronology.Chronology;
import com.powsybl.glsk.commons.chronology.ChronologyImpl;
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.threeten.extra.Interval;
import java.time.Duration;
import java.time.Instant;
import java.time.Period;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Joris Mancini {@literal <joris.mancini at rte-france.com>}
*/
public class ZonalDataChronologyFromGlskDocument<I> implements ZonalDataChronology<I> {
private static final String UNMODIFIABLE = "ZonalDataChronologyFromGlskDocument objects are unmodifiable.";
private final Map<String, Chronology<I>> dataChronologyPerZone;
public ZonalDataChronologyFromGlskDocument(GlskDocument glskDocument, Network network, GlskPointToLinearDataConverter<I> converter) {
dataChronologyPerZone = new HashMap<>();
for (String zone : glskDocument.getZones()) {
Chronology<I> dataChronology = ChronologyImpl.create();
//mapping with DataChronology
List<GlskPoint> glskPointList = glskDocument.getGlskPoints(zone);
for (GlskPoint point : glskPointList) {
I linearData = converter.convert(network, point);
dataChronology.storeDataOnInterval(linearData, point.getPointInterval());
}
dataChronologyPerZone.put(zone, dataChronology);
}
}
@Override
public ZonalData<I> selectInstant(Instant instant) {
return selectInstant(instant, ReplacementStrategy.NO_REPLACEMENT);
}
@Override
public ZonalData<I> selectInstant(Instant instant, ReplacementStrategy replacementStrategy) {
Objects.requireNonNull(instant, "Unable to return data if no instant are selected.");
return new ZonalDataImpl<>(dataChronologyPerZone.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().selectInstant(instant, replacementStrategy)
)));
}
@Override
public void storeDataAtInstant(ZonalData<I> data, Instant instant) {
throw new GlskException(UNMODIFIABLE);
}
@Override
public void storeDataAtInstant(ZonalData<I> data, Instant instant, Duration duration) {
throw new GlskException(UNMODIFIABLE);
}
@Override
public void storeDataAtInstant(ZonalData<I> data, Instant instant, Period period) {
throw new GlskException(UNMODIFIABLE);
}
@Override
public void storeDataOnInterval(ZonalData<I> data, Interval interval) {
throw new GlskException(UNMODIFIABLE);
}
@Override
public void storeDataBetweenInstants(ZonalData<I> data, Instant from, Instant to) {
throw new GlskException(UNMODIFIABLE);
}
}