package com.jetdrone.vertx.yoke.json; import java.util.List; import java.util.Map; public final class AnyValidator { public static boolean isValid(Object instance, JsonSchemaResolver.Schema schema) { // validate required if (instance == null) { if (Boolean.TRUE.equals(schema.get("required"))) { return false; } } // apply default value if (instance == null) { instance = schema.get("default"); } if (instance != null) { // validate enum List<Object> _enum = schema.get("enum"); if (_enum != null && !_enum.contains(instance)) { return false; } // TODO: type // validate allOf List<Object> allOf = schema.get("allOf"); if (allOf != null) { for (int i = 0; i < allOf.size(); i++) { Object item = allOf.get(i); if (item instanceof Map) { // convert to schema item = JsonSchemaResolver.resolveSchema((Map<String, Object>) item); allOf.set(i, item); } if (!JsonSchema.conformsSchema(instance, (JsonSchemaResolver.Schema) item)) { return false; } } } // validate anyOf List<Object> anyOf = schema.get("anyOf"); if (anyOf != null) { boolean match = false; for (int i = 0; i < anyOf.size(); i++) { Object item = anyOf.get(i); if (item instanceof Map) { // convert to schema item = JsonSchemaResolver.resolveSchema((Map<String, Object>) item); anyOf.set(i, item); } if (JsonSchema.conformsSchema(instance, (JsonSchemaResolver.Schema) item)) { match = true; break; } } if (!match) { return false; } } // validate oneOf List<Object> oneOf = schema.get("oneOf"); if (oneOf != null) { int matches = 0; for (int i = 0; i < oneOf.size(); i++) { Object item = oneOf.get(i); if (item instanceof Map) { // convert to schema item = JsonSchemaResolver.resolveSchema((Map<String, Object>) item, schema.getParent()); oneOf.set(i, item); } if (JsonSchema.conformsSchema(instance, (JsonSchemaResolver.Schema) item)) { matches++; } } if (matches == 0) { return false; } } // validate not Object not = schema.get("not"); if (not != null) { if (not instanceof Map) { // convert to schema not = JsonSchemaResolver.resolveSchema((Map<String, Object>) not, schema.getParent()); schema.put("not", not); } if (JsonSchema.conformsSchema(instance, (JsonSchemaResolver.Schema) not)) { return false; } } // TODO: definitions } return true; } }