SecurityAnalysisResultXmlWriterContext.java

/**
 * Copyright (c) 2021, 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.cne.converter;

import com.powsybl.cne.model.ContingencySeries;
import com.powsybl.cne.model.MonitoredRegisteredResource;
import com.powsybl.security.LimitViolation;
import com.powsybl.security.LimitViolationType;
import com.powsybl.security.SecurityAnalysisResult;
import com.powsybl.security.results.PostContingencyResult;

import javax.xml.stream.XMLStreamWriter;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author Thomas Adam {@literal <tadam at silicom.fr>}
 */
class SecurityAnalysisResultXmlWriterContext {

    private static final String MISSING_SUFFIX = " is missing";

    private final XMLStreamWriter writer;

    private final CneExportOptions options;

    private final List<MonitoredRegisteredResource> preMonitoredRegisteredResources = new ArrayList<>();

    private final Map<ContingencySeries, List<MonitoredRegisteredResource>> postMonitoredRegisteredResources = new HashMap<>();

    SecurityAnalysisResultXmlWriterContext(SecurityAnalysisResult result, CneExportOptions options, XMLStreamWriter writer) {
        this.writer = writer;
        this.options = checkRequiredParameters(options);
        // PreContingencyResult
        preMonitoredRegisteredResources.addAll(convert(result.getPreContingencyResult().getLimitViolationsResult().getLimitViolations()));
        // PostContingencyResult
        Collection<PostContingencyResult> postResults = result.getPostContingencyResults();
        postResults.forEach(p -> postMonitoredRegisteredResources.put(new ContingencySeries(p.getContingency()), convert(p.getLimitViolationsResult().getLimitViolations())));
    }

    private List<MonitoredRegisteredResource> convert(List<LimitViolation> limitViolations) {
        final List<MonitoredRegisteredResource> monitoredRegisteredResources = new ArrayList<>();
        // Remove LimitViolationType.OTHER
        Collection<LimitViolation> lvFiltered = limitViolations.stream().filter(l -> l.getLimitType() != LimitViolationType.OTHER).collect(Collectors.toList());
        // List all equipment id involved
        Collection<String> equipmentIds = lvFiltered.stream().map(LimitViolation::getSubjectId).collect(Collectors.toList());
        // Build MonitoredRegisteredResources list
        equipmentIds.forEach(id -> {
            Collection<LimitViolation> lv = lvFiltered.stream().filter(l -> l.getSubjectId().compareTo(id) == 0).collect(Collectors.toList());
            monitoredRegisteredResources.add(new MonitoredRegisteredResource(lv));
        });
        return monitoredRegisteredResources;
    }

    private CneExportOptions checkRequiredParameters(CneExportOptions options) {
        Objects.requireNonNull(options.getMRID(), CneConstants.MRID + MISSING_SUFFIX);
        Objects.requireNonNull(options.getSenderMarketParticipantMRID(), CneConstants.SENDER_MARKET_PARTICIPANT_MRID + MISSING_SUFFIX);
        Objects.requireNonNull(options.getReceiverMarketParticipantMRID(), CneConstants.RECEIVER_MARKET_PARTICIPANT_MRID + MISSING_SUFFIX);
        Objects.requireNonNull(options.getTimeSeriesMRID(), CneConstants.TIME_SERIES_MRID + MISSING_SUFFIX);
        Objects.requireNonNull(options.getInDomainMRID(), CneConstants.IN_DOMAIN_MRID + MISSING_SUFFIX);
        Objects.requireNonNull(options.getOutDomainMRID(), CneConstants.OUT_DOMAIN_MRID + MISSING_SUFFIX);
        return options;
    }

    public XMLStreamWriter getWriter() {
        return writer;
    }

    CneExportOptions getParameters() {
        return options;
    }

    List<MonitoredRegisteredResource> getPreMonitoredRegisteredResources() {
        return preMonitoredRegisteredResources;
    }

    Map<ContingencySeries, List<MonitoredRegisteredResource>> getPostMonitoredRegisteredResources() {
        return postMonitoredRegisteredResources;
    }
}