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

com.exasol.errorcodecrawlermavenplugin.validation.ParametersValidator Maven / Gradle / Ivy

package com.exasol.errorcodecrawlermavenplugin.validation;

import static com.exasol.errorcodecrawlermavenplugin.validation.PositionFormatter.getFormattedPosition;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.exasol.errorcodecrawlermavenplugin.Finding;
import com.exasol.errorreporting.*;
import com.exsol.errorcodemodel.ErrorMessageDeclaration;
import com.exsol.errorcodemodel.NamedParameter;

/**
 * This {@link ErrorMessageDeclarationValidator} validates that all parameters used in message and mitigation are
 * declared.
 */
// [impl->dsn~parameters-validator~1]
class ParametersValidator extends AbstractIndependentErrorMessageDeclarationValidator {

        @Override
        protected Stream validateSingleErrorMessageDeclaration(
                        final ErrorMessageDeclaration errorMessageDeclaration) {
                final String textWithPlaceholders = errorMessageDeclaration.getMessage()
                                + String.join(" ", errorMessageDeclaration.getMitigations());
                final Stream.Builder findings = Stream.builder();
                final Iterable placeholders = PlaceholderMatcher.findPlaceholders(textWithPlaceholders);
                placeholders.forEach(
                                placeholder -> validatePlaceholder(errorMessageDeclaration, placeholder.getReference())
                                                .ifPresent(findings::add));
                return findings.build();
        }

        private Optional validatePlaceholder(final ErrorMessageDeclaration errorMessageDeclaration,
                        final String placeholder) {
                final List matchingParameters = errorMessageDeclaration.getNamedParameters().stream()
                                .filter(parameter -> parameter.getName().equals(placeholder))
                                .collect(Collectors.toList());
                if (matchingParameters.isEmpty()) {
                        return Optional.of(new Finding(ExaError.messageBuilder("E-ECM-17")
                                        .message("The parameter {{parameter name}} was used but not declared.")
                                        .message(" ({{position|uq}})")
                                        .mitigation("Declare the parameter using parameter(\"{{parameter name|uq}}\", value) or unquotedParameter(\"{{parameter name|uq}}\", value).")
                                        .parameter("parameter name", placeholder)
                                        .parameter("position", getFormattedPosition(errorMessageDeclaration))
                                        .toString()));
                } else if (matchingParameters.size() > 1) {
                        return Optional.of(new Finding(ExaError.messageBuilder("E-ECM-18")
                                        .message("The parameter {{parameter name}} was declared multiple times.")
                                        .message(" ({{position|uq}})")
                                        .mitigation("Remove one of the parameter(\"{{parameter name|uq}}\", value) or unquotedParameter(\"{{parameter name|uq}}\", value) calls.")
                                        .parameter("parameter name", placeholder)
                                        .parameter("position", getFormattedPosition(errorMessageDeclaration))
                                        .toString()));
                } else {
                        return Optional.empty();
                }
        }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy