package io.vertx.ext.web.api.validation.impl;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.networknt.schema.JsonSchema;
import com.networknt.schema.JsonSchemaFactory;
import com.networknt.schema.ValidationMessage;
import io.vertx.core.json.Json;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.api.RequestParameter;
import io.vertx.ext.web.api.validation.ParameterTypeValidator;
import io.vertx.ext.web.api.validation.ValidationException;

import java.io.IOException;
import java.util.Set;

Author:Francesco Guardiani @slinkydeveloper
/** * @author Francesco Guardiani @slinkydeveloper */
public class JsonTypeValidator implements ParameterTypeValidator { JsonSchema schema; public JsonTypeValidator(JsonSchema schema) { this.schema = schema; } @Override public RequestParameter isValid(String value) throws ValidationException { try { JsonNode node; if (value == null) throw ValidationException.ValidationExceptionFactory.generateNotParsableJsonBodyException("Json should not be null"); else if (value.length() == 0) node = JsonNodeFactory.instance.textNode(""); else node = Json.mapper.readTree(value); Set<ValidationMessage> errors = schema.validate(node); if (errors.size() == 0) { if (node.isArray()) return RequestParameter.create(new JsonArray(value)); else if (node.isObject()) return RequestParameter.create(new JsonObject(value)); else return RequestParameter.create(value); } else { ValidationMessage firstError = errors.iterator().next(); throw ValidationException.ValidationExceptionFactory.generateInvalidJsonBodyException(firstError.getPath(), value, firstError.getMessage()); } } catch (IOException e) { throw ValidationException.ValidationExceptionFactory.generateNotParsableJsonBodyException(e.getMessage()); } } public static class JsonTypeValidatorFactory { public static JsonTypeValidator createJsonTypeValidator(JsonNode schema) { return new JsonTypeValidator(JsonSchemaFactory.getInstance().getSchema(schema)); } public static JsonTypeValidator createJsonTypeValidator(String schema) { if (schema.length() != 0) { try { return createJsonTypeValidator(Json.mapper.readTree(schema)); } catch (IOException e) { throw new IllegalArgumentException("schema provided is invalid: " + e); } } else return null; } } }