All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.exsol.errorcodemodel.ErrorCodeReportWriter Maven / Gradle / Ivy

package com.exsol.errorcodemodel;

import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;

import com.exasol.errorreporting.ExaError;

import jakarta.json.*;
import jakarta.json.spi.JsonProvider;

/**
 * This class writes an {@link ErrorCodeReport} to JSON file.
 */
public class ErrorCodeReportWriter {
    /** Schema of the report */
    public static final String SCHEMA = "https://schemas.exasol.com/error_code_report-1.0.0.json";
    private static final JsonProvider JSON = JsonProvider.provider();

    /**
     * Write an {@link ErrorCodeReport} to JSON file.
     * 
     * @param report report to write
     * @param target target file
     */
    public void writeReport(final ErrorCodeReport report, final Path target) {
        final JsonObject reportJson = renderReport(report);
        try (final FileWriter fileWriter = new FileWriter(target.toFile());
                final JsonWriter jsonWriter = JSON.createWriter(fileWriter)) {
            jsonWriter.write(reportJson);
        } catch (final IOException exception) {
            throw new IllegalStateException(
                    ExaError.messageBuilder("E-ECMOJ-5").message("Failed to write error-code-report.").toString(),
                    exception);
        }
    }

    private JsonObject renderReport(final ErrorCodeReport report) {
        final JsonObjectBuilder reportJson = JSON.createObjectBuilder();
        reportJson.add("$schema", SCHEMA);
        if (report.getProjectName() != null) {
            reportJson.add("projectName", report.getProjectName());
        }
        if (report.getProjectVersion() != null) {
            reportJson.add("projectVersion", report.getProjectVersion());
        }
        reportJson.add("errorCodes", renderErrorCodes(report.getErrorMessageDeclarations()));
        return reportJson.build();
    }

    private JsonArrayBuilder renderErrorCodes(final List errorMessageDeclarations) {
        final JsonArrayBuilder errorCodesBuilder = JSON.createArrayBuilder();
        for (final ErrorMessageDeclaration errorMessageDeclaration : errorMessageDeclarations) {
            errorCodesBuilder.add(renderErrorCode(errorMessageDeclaration));
        }
        return errorCodesBuilder;
    }

    private JsonObjectBuilder renderErrorCode(final ErrorMessageDeclaration errorMessageDeclaration) {
        final JsonObjectBuilder errorCode = JSON.createObjectBuilder();
        addIfNotNull(errorCode, "identifier", errorMessageDeclaration.getIdentifier());
        addIfNotNull(errorCode, "message", errorMessageDeclaration.getMessage());
        errorCode.add("messagePlaceholders", renderPlaceholders(errorMessageDeclaration.getNamedParameters()));
        addIfNotNull(errorCode, "sourceFile", errorMessageDeclaration.getSourceFile());
        if (errorMessageDeclaration.getLine() != -1) {
            errorCode.add("sourceLine", errorMessageDeclaration.getLine());
        }
        errorCode.add("mitigations", renderMitigations(errorMessageDeclaration));
        return errorCode;
    }

    private JsonArrayBuilder renderMitigations(final ErrorMessageDeclaration errorMessageDeclaration) {
        final JsonArrayBuilder mitigationsJson = JSON.createArrayBuilder();
        for (final String mitigation : errorMessageDeclaration.getMitigations()) {
            mitigationsJson.add(mitigation);
        }
        return mitigationsJson;
    }

    private JsonArrayBuilder renderPlaceholders(final List placeholders) {
        final JsonArrayBuilder placeholdersJsonBuilder = JSON.createArrayBuilder();
        for (final NamedParameter placeholder : placeholders) {
            final JsonObjectBuilder placeholderJsonBuilder = JSON.createObjectBuilder();
            placeholderJsonBuilder.add("placeholder", placeholder.getName());
            addIfNotNull(placeholderJsonBuilder, "description", placeholder.getDescription());
            placeholdersJsonBuilder.add(placeholderJsonBuilder);
        }
        return placeholdersJsonBuilder;
    }

    private void addIfNotNull(final JsonObjectBuilder builder, final String key, final String value) {
        if (value != null) {
            builder.add(key, value);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy