
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