ContingencyLoadFlowParametersJsonSerializer.java
/**
* Copyright (c) 2024, Coreso SA (https://www.coreso.eu/) and TSCNET Services GmbH (https://www.tscnet.eu/)
* 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.openloadflow.sa.extensions;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.google.auto.service.AutoService;
import com.powsybl.commons.PowsyblException;
import com.powsybl.commons.extensions.ExtensionJsonSerializer;
import com.powsybl.commons.json.JsonUtil;
import com.powsybl.contingency.Contingency;
import com.powsybl.loadflow.LoadFlowParameters;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
/**
* @author Valentin Mouradian {@literal <valentin.mouradian at artelys.com>}
*/
@AutoService(ExtensionJsonSerializer.class)
public class ContingencyLoadFlowParametersJsonSerializer implements ExtensionJsonSerializer<Contingency, ContingencyLoadFlowParameters> {
@Override
public String getExtensionName() {
return "contingency-load-flow-parameters";
}
@Override
public String getCategoryName() {
return "security-analysis";
}
@Override
public Class<? super ContingencyLoadFlowParameters> getExtensionClass() {
return ContingencyLoadFlowParameters.class;
}
@Override
public void serialize(ContingencyLoadFlowParameters extension, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
Optional<Boolean> distributedSlack = extension.isDistributedSlack();
Optional<Boolean> areaInterchangeControl = extension.isAreaInterchangeControl();
Optional<LoadFlowParameters.BalanceType> balanceType = extension.getBalanceType();
Optional<List<String>> outerLoopNames = extension.getOuterLoopNames();
jsonGenerator.writeStartObject();
if (distributedSlack.isPresent()) {
jsonGenerator.writeBooleanField("distributedSlack", distributedSlack.get());
}
if (areaInterchangeControl.isPresent()) {
jsonGenerator.writeBooleanField("areaInterchangeControl", areaInterchangeControl.get());
}
if (balanceType.isPresent()) {
jsonGenerator.writeStringField("balanceType", balanceType.get().name());
}
if (outerLoopNames.isPresent()) {
jsonGenerator.writeArrayFieldStart("outerLoopNames");
for (String name : outerLoopNames.get()) {
jsonGenerator.writeString(name);
}
jsonGenerator.writeEndArray();
}
jsonGenerator.writeEndObject();
}
@Override
public ContingencyLoadFlowParameters deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
ContingencyLoadFlowParameters contingencyLoadFlowParameters = new ContingencyLoadFlowParameters();
while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
if (jsonParser.currentName().equals("distributedSlack")) {
jsonParser.nextToken();
boolean distributedSlack = jsonParser.readValueAs(Boolean.class);
contingencyLoadFlowParameters.setDistributedSlack(distributedSlack);
} else if (jsonParser.currentName().equals("areaInterchangeControl")) {
jsonParser.nextToken();
boolean areaInterchangeControl = jsonParser.readValueAs(Boolean.class);
contingencyLoadFlowParameters.setAreaInterchangeControl(areaInterchangeControl);
} else if (jsonParser.currentName().equals("balanceType")) {
jsonParser.nextToken();
LoadFlowParameters.BalanceType balanceType = LoadFlowParameters.BalanceType.valueOf(jsonParser.readValueAs(String.class));
contingencyLoadFlowParameters.setBalanceType(balanceType);
} else if (jsonParser.currentName().equals("outerLoopNames")) {
jsonParser.nextToken();
List<String> outerLoopNames = JsonUtil.readList(deserializationContext, jsonParser, String.class);
contingencyLoadFlowParameters.setOuterLoopNames(outerLoopNames);
} else {
throw new PowsyblException("Unexpected field: " + jsonParser.currentName());
}
}
return contingencyLoadFlowParameters;
}
}