AbstractReportNodeAdderOrBuilder.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.commons.report;

import java.time.format.DateTimeFormatter;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @author Florian Dupuy {@literal <florian.dupuy at rte-france.com>}
 */
public abstract class AbstractReportNodeAdderOrBuilder<T extends ReportNodeAdderOrBuilder<T>> implements ReportNodeAdderOrBuilder<T> {

    protected final Map<String, TypedValue> values = new LinkedHashMap<>();
    protected String key;
    protected String messageTemplate;
    protected boolean withTimestamp = false;
    protected String timestampPattern;
    protected MessageTemplateProvider messageTemplateProvider = MessageTemplateProvider.EMPTY;

    @Override
    public T withMessageTemplateProvider(MessageTemplateProvider messageTemplateProvider) {
        this.messageTemplateProvider = Objects.requireNonNull(messageTemplateProvider);
        return self();
    }

    @Override
    public T withMessageTemplate(String key, String messageTemplate) {
        this.key = key;
        this.messageTemplate = messageTemplate;
        return self();
    }

    @Override
    public T withMessageTemplate(String key) {
        this.key = key;
        return self();
    }

    @Override
    public T withTypedValue(String key, String value, String type) {
        values.put(key, TypedValue.of(value, type));
        return self();
    }

    @Override
    public T withUntypedValue(String key, String value) {
        values.put(key, TypedValue.untyped(value));
        return self();
    }

    @Override
    public T withTypedValue(String key, double value, String type) {
        values.put(key, TypedValue.of(value, type));
        return self();
    }

    @Override
    public T withUntypedValue(String key, double value) {
        values.put(key, TypedValue.untyped(value));
        return self();
    }

    @Override
    public T withTypedValue(String key, float value, String type) {
        values.put(key, TypedValue.of(value, type));
        return self();
    }

    @Override
    public T withUntypedValue(String key, float value) {
        values.put(key, TypedValue.untyped(value));
        return self();
    }

    @Override
    public T withTypedValue(String key, int value, String type) {
        values.put(key, TypedValue.of(value, type));
        return self();
    }

    @Override
    public T withUntypedValue(String key, int value) {
        values.put(key, TypedValue.untyped(value));
        return self();
    }

    @Override
    public T withTypedValue(String key, long value, String type) {
        values.put(key, TypedValue.of(value, type));
        return self();
    }

    @Override
    public T withUntypedValue(String key, long value) {
        values.put(key, TypedValue.untyped(value));
        return self();
    }

    @Override
    public T withTypedValue(String key, boolean value, String type) {
        values.put(key, TypedValue.of(value, type));
        return self();
    }

    @Override
    public T withUntypedValue(String key, boolean value) {
        values.put(key, TypedValue.untyped(value));
        return self();
    }

    @Override
    public T withSeverity(TypedValue severity) {
        TypedValue.checkSeverityType(severity);
        values.put(ReportConstants.SEVERITY_KEY, severity);
        return self();
    }

    @Override
    public T withSeverity(String severity) {
        values.put(ReportConstants.SEVERITY_KEY, TypedValue.of(severity, TypedValue.SEVERITY));
        return self();
    }

    @Override
    public T withTimestamp() {
        this.withTimestamp = true;
        return self();
    }

    @Override
    public T withTimestamp(String pattern) {
        this.withTimestamp = true;
        this.timestampPattern = Objects.requireNonNull(pattern);
        return self();
    }

    protected void updateTreeDictionary(TreeContext treeContext) {
        if (messageTemplate == null) {
            treeContext.addDictionaryEntry(key, messageTemplateProvider);
        } else {
            treeContext.addDictionaryEntry(key, (k, l) -> messageTemplate);
        }
    }

    protected void addTimeStampValue(TreeContext treeContext) {
        DateTimeFormatter formatter = timestampPattern != null
                ? DateTimeFormatter.ofPattern(timestampPattern, treeContext.getLocale())
                : treeContext.getDefaultTimestampFormatter();
        values.put(ReportConstants.TIMESTAMP_KEY, TypedValue.getTimestamp(formatter));
    }

    protected abstract T self();
}