in config/src/main/java/com/epam/aidial/core/config/validation/CustomApplicationsConformToTypeSchemasValidator.java [33:71]
public boolean isValid(Config value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
JsonSchemaFactory schemaFactory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7, builder ->
builder.schemaLoaders(loaders -> loaders.schemas(value.getApplicationTypeSchemas()))
.metaSchema(DIAL_META_SCHEMA)
);
ObjectMapper mapper = new ObjectMapper();
for (Map.Entry<String, Application> entry : value.getApplications().entrySet()) {
Application application = entry.getValue();
URI schemaId = application.getApplicationTypeSchemaId();
if (schemaId == null) {
continue;
}
JsonSchema schema = schemaFactory.getSchema(schemaId);
if (application.getApplicationProperties() == null) {
continue;
}
JsonNode applicationNode = mapper.valueToTree(application.getApplicationProperties());
Set<ValidationMessage> validationResults = schema.validate(applicationNode);
if (!validationResults.isEmpty()) {
String logMessage = validationResults.stream()
.map(ValidationMessage::getMessage)
.reduce((a, b) -> a + ", " + b)
.orElse("Unknown validation error");
log.error("Application {} does not conform to schema {}: {}", entry.getKey(), schemaId, logMessage);
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate())
.addPropertyNode("applications")
.addContainerElementNode(entry.getKey(), Map.class, 0)
.addConstraintViolation();
return false;
}
}
return true;
}