JsonOpenRaoSearchTreeParameters.java

/*
 * Copyright (c) 2024, 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.openrao.raoapi.json.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.openrao.commons.OpenRaoException;
import com.powsybl.openrao.raoapi.json.*;
import com.powsybl.openrao.raoapi.parameters.extensions.OpenRaoSearchTreeParameters;

import java.io.IOException;

import static com.powsybl.openrao.raoapi.RaoParametersCommons.*;

/**
 * @author Pauline JEAN-MARIE {@literal <pauline.jean-marie at artelys.com>}
 */
@AutoService(JsonRaoParameters.ExtensionSerializer.class)
public class JsonOpenRaoSearchTreeParameters implements JsonRaoParameters.ExtensionSerializer<OpenRaoSearchTreeParameters> {
    @Override
    public void serialize(OpenRaoSearchTreeParameters parameters, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeStartObject();
        JsonObjectiveFunctionParameters.serialize(parameters, jsonGenerator);
        JsonRangeActionsOptimizationParameters.serialize(parameters, jsonGenerator);
        JsonTopoOptimizationParameters.serialize(parameters, jsonGenerator);
        JsonSecondPreventiveRaoParameters.serialize(parameters, jsonGenerator);
        JsonLoadFlowAndSensitivityComputationParameters.serialize(parameters, jsonGenerator, serializerProvider);
        JsonMultiThreadingParameters.serialize(parameters, jsonGenerator);
        JsonMnecParameters.serialize(parameters, jsonGenerator);
        JsonRelativeMarginsParameters.serialize(parameters, jsonGenerator);
        JsonLoopFlowParameters.serialize(parameters, jsonGenerator);
        JsonMinMarginsParameters.serialize(parameters, jsonGenerator);
        jsonGenerator.writeEndObject();
    }

    @Override
    public OpenRaoSearchTreeParameters deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        return deserializeAndUpdate(jsonParser, deserializationContext, new OpenRaoSearchTreeParameters());
    }

    @Override
    public OpenRaoSearchTreeParameters deserializeAndUpdate(JsonParser parser, DeserializationContext deserializationContext, OpenRaoSearchTreeParameters parameters) throws IOException {
        while (parser.nextToken() != JsonToken.END_OBJECT) {
            switch (parser.getCurrentName()) {
                case OBJECTIVE_FUNCTION:
                    parser.nextToken();
                    JsonObjectiveFunctionParameters.deserialize(parser, parameters);
                    break;
                case RANGE_ACTIONS_OPTIMIZATION:
                    parser.nextToken();
                    JsonRangeActionsOptimizationParameters.deserialize(parser, parameters);
                    break;
                case TOPOLOGICAL_ACTIONS_OPTIMIZATION:
                    parser.nextToken();
                    JsonTopoOptimizationParameters.deserialize(parser, parameters);
                    break;
                case MULTI_THREADING:
                    parser.nextToken();
                    JsonMultiThreadingParameters.deserialize(parser, parameters);
                    break;
                case SECOND_PREVENTIVE_RAO:
                    parser.nextToken();
                    JsonSecondPreventiveRaoParameters.deserialize(parser, parameters);
                    break;
                case LOAD_FLOW_AND_SENSITIVITY_COMPUTATION:
                    parser.nextToken();
                    JsonLoadFlowAndSensitivityComputationParameters.deserialize(parser, parameters);
                    break;
                case MNEC_PARAMETERS:
                    parser.nextToken();
                    JsonMnecParameters.deserialize(parser, parameters);
                    break;
                case RELATIVE_MARGINS:
                    parser.nextToken();
                    JsonRelativeMarginsParameters.deserialize(parser, parameters);
                    break;
                case LOOP_FLOW_PARAMETERS:
                    parser.nextToken();
                    JsonLoopFlowParameters.deserialize(parser, parameters);
                    break;
                case COSTLY_MIN_MARGIN_PARAMETERS:
                    parser.nextToken();
                    JsonMinMarginsParameters.deserialize(parser, parameters);
                    break;
                default:
                    throw new OpenRaoException("Unexpected field in open rao search tree parameters: " + parser.getCurrentName());
            }
        }
        return parameters;
    }

    @Override
    public String getExtensionName() {
        return SEARCH_TREE_PARAMETERS;
    }

    @Override
    public String getCategoryName() {
        return "rao-parameters";
    }

    @Override
    public Class<? super OpenRaoSearchTreeParameters> getExtensionClass() {
        return OpenRaoSearchTreeParameters.class;
    }

}