package com.jetdrone.vertx.yoke.json;
import io.vertx.core.json.JsonArray;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public final class ArrayValidator {
public static boolean isValid(Object instance, JsonSchemaResolver.Schema schema) {
if (!isArray(instance)) {
return false;
}
// apply default value
if (instance == null) {
instance = schema.get("default");
}
// from now on work with lists
if (instance instanceof JsonArray) {
instance = ((JsonArray) instance).getList();
}
final List array = (List) instance;
if (array != null) {
// validate additionalItems
Boolean additionalItems = schema.get("additionalItems");
if (additionalItems != null && !additionalItems) {
List<Object> items = schema.get("items");
if (array.size() > items.size()) {
return false;
}
}
// validate maxItems
Integer maxItems = schema.get("maxItems");
if (maxItems != null) {
if (array.size() > maxItems) {
return false;
}
}
// validate minItems
Integer minItems = schema.get("minItems");
if (minItems != null) {
if (array.size() < minItems) {
return false;
}
}
// validate uniqueItems
Boolean uniqueItems = schema.get("uniqueItems");
if (uniqueItems != null && uniqueItems) {
Set<Object> set = new HashSet<>();
for (Object o : array) {
if (!set.add(o)) {
return false;
}
}
set.clear();
}
Object items = schema.get("items");
JsonSchemaResolver.Schema itemsSchema = null;
if (items instanceof JsonSchemaResolver.Schema) {
itemsSchema = (JsonSchemaResolver.Schema) items;
} else {
if (items instanceof Map) {
// convert to schema
itemsSchema = JsonSchemaResolver.resolveSchema((Map<String, Object>) items, schema.getParent());
schema.put("items", itemsSchema);
}
}
// setParentIfNotNull(itemsSchema, schema);
for (Object item : array) {
if (!JsonSchema.conformsSchema(item, itemsSchema)) {
return false;
}
}
}
return true;
}
private static boolean isArray(Object value) {
return value == null || value instanceof List || value instanceof JsonArray;
}
private static void setParentIfNotNull(JsonSchemaResolver.Schema schema, JsonSchemaResolver.Schema parent) {
if (schema != null) {
schema.setParent(parent);
}
}
}