Skip to content

Commit

Permalink
Introduced new validators and validating control flow improved
Browse files Browse the repository at this point in the history
  • Loading branch information
Felipe444 committed Aug 10, 2019
1 parent e81f81a commit 542bedf
Show file tree
Hide file tree
Showing 16 changed files with 284 additions and 171 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.hltech.vaunt.validator;

import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.BooleanSchema;

import java.util.List;

public class BooleanSchemaValidator extends ValueTypeSchemaValidator {

@Override
public List<String> validate(JsonSchema consumerSchema, JsonSchema providerSchema) {
return super.validate(consumerSchema, providerSchema);
}

@Override
public Class<?> supportsSchemaType() {
return BooleanSchema.class;
}
}
Original file line number Diff line number Diff line change
@@ -1,44 +1,38 @@
package com.hltech.vaunt.validator;

import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.ContainerTypeSchema;

import java.util.ArrayList;
import java.util.List;

import static com.hltech.vaunt.validator.JsonSchemaValidator.ERROR_FORMAT;
public abstract class ContainerTypeSchemaValidator extends SimpleTypeSchemaValidator {

public class ContainerTypeSchemaValidator {
@Override
public List<String> validate(JsonSchema consumerSchema, JsonSchema providerSchema) {
List<String> errors = super.validate(consumerSchema, providerSchema);

public static List<String> validate(ContainerTypeSchema consumerSchema, ContainerTypeSchema providerSchema) {
List<String> errors = new ArrayList<>(SimpleTypeSchemaValidator.validate(consumerSchema, providerSchema));
ContainerTypeSchema consumerContainerTypeSchema = consumerSchema.asContainerTypeSchema();
ContainerTypeSchema providerContainerTypeSchema = providerSchema.asContainerTypeSchema();

if (!isValidEnum(consumerSchema, providerSchema)) {
if (!isValidEnum(consumerContainerTypeSchema, providerContainerTypeSchema)) {
errors.add(String.format(ERROR_FORMAT,
consumerSchema.getId(),
"enums",
consumerSchema.getEnums(),
providerSchema.getEnums()));
consumerContainerTypeSchema.getEnums(),
providerContainerTypeSchema.getEnums()));
}

if (!equals(consumerSchema.getOneOf(), providerSchema.getOneOf())) {
if (!equals(consumerContainerTypeSchema.getOneOf(), providerContainerTypeSchema.getOneOf())) {
errors.add(String.format(ERROR_FORMAT,
consumerSchema.getId(),
"oneOf",
consumerSchema.getOneOf(),
providerSchema.getOneOf()));
consumerContainerTypeSchema.getOneOf(),
providerContainerTypeSchema.getOneOf()));
}

return errors;
}

private static boolean equals(Object object1, Object object2) {
if (object1 == null) {
return object2 == null;
} else {
return object1.equals(object2);
}
}

private static boolean isValidEnum(ContainerTypeSchema consumerBody, ContainerTypeSchema providerBody) {
if (representsString(consumerBody) && representsEnum(providerBody)) {
return false;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.hltech.vaunt.validator;

import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.IntegerSchema;

import java.util.List;

public class IntegerSchemaValidator extends NumberSchemaValidator {

@Override
public List<String> validate(JsonSchema consumerSchema, JsonSchema providerSchema) {
List<String> errors = super.validate(consumerSchema, providerSchema);

IntegerSchema consumerIntegerSchema = consumerSchema.asIntegerSchema();
IntegerSchema providerIntegerSchema = providerSchema.asIntegerSchema();

if (!equals(consumerIntegerSchema.getDivisibleBy(), providerIntegerSchema.getDivisibleBy())) {
errors.add(String.format(ERROR_FORMAT,
consumerIntegerSchema.getId(),
"divisibleBy",
consumerIntegerSchema.getDivisibleBy(),
providerIntegerSchema.getDivisibleBy()));
}

return errors;
}

@Override
public Class<?> supportsSchemaType() {
return IntegerSchema.class;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class JsonSchemaValidator {
public abstract class JsonSchemaValidator {
static final String ERROR_FORMAT = "Schema with id %s has not matching %s - consumer: %s, provider: %s";
static final String ERROR_FORMAT_SHORT = "Schema with id %s has not matching %s";

public static List<String> validate(JsonSchema consumerSchema, JsonSchema providerSchema) {
public abstract Class<?> supportsSchemaType();

public List<String> validate(JsonSchema consumerSchema, JsonSchema providerSchema) {
List<String> errors = new ArrayList<>();

if (!equals(consumerSchema.get$ref(), providerSchema.get$ref())) {
Expand Down Expand Up @@ -72,19 +75,15 @@ public static List<String> validate(JsonSchema consumerSchema, JsonSchema provid
return errors;
}

private static boolean isRequired(JsonSchema schema) {
private boolean isRequired(JsonSchema schema) {
return schema.getRequired() != null && schema.getRequired();
}

public static boolean equals(Object object1, Object object2) {
if (object1 == null) {
return object2 == null;
} else {
return object1.equals(object2);
}
boolean equals(Object object1, Object object2) {
return Objects.equals(object1, object2);
}

private static <T> boolean arraysEquals(T[] array1, T[] array2) {
private <T> boolean arraysEquals(T[] array1, T[] array2) {
if (array1 == null) {
return array2 == null;
}
Expand All @@ -95,7 +94,7 @@ private static <T> boolean arraysEquals(T[] array1, T[] array2) {
return Arrays.equals(array1, array2);
}

private static String jsonArrayToString(JsonSchema[] array) {
private String jsonArrayToString(JsonSchema[] array) {
if (array == null) {
return "null";
}
Expand All @@ -116,7 +115,7 @@ private static String jsonArrayToString(JsonSchema[] array) {
}
}

private static String jsonToString(JsonSchema object) {
String jsonToString(JsonSchema object) {
return "JsonSchema(id=" + object.getId() + ")";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.hltech.vaunt.validator;

import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.types.NumberSchema;

import java.util.List;

public class NumberSchemaValidator extends ValueTypeSchemaValidator {

@Override
public List<String> validate(JsonSchema consumerSchema, JsonSchema providerSchema) {
List<String> errors = super.validate(consumerSchema, providerSchema);

NumberSchema consumerNumberSchema = consumerSchema.asNumberSchema();
NumberSchema providerNumberSchema = providerSchema.asNumberSchema();

if (!equals(consumerNumberSchema.getExclusiveMaximum(), providerNumberSchema.getExclusiveMaximum())) {
errors.add(String.format(ERROR_FORMAT,
consumerNumberSchema.getId(),
"exclusiveMaximum",
consumerNumberSchema.getExclusiveMaximum(),
providerNumberSchema.getExclusiveMaximum()));
}

if (!equals(consumerNumberSchema.getExclusiveMinimum(), providerNumberSchema.getExclusiveMinimum())) {
errors.add(String.format(ERROR_FORMAT,
consumerNumberSchema.getId(),
"exclusiveMinimum",
consumerNumberSchema.getExclusiveMinimum(),
providerNumberSchema.getExclusiveMinimum()));
}

if (!equals(consumerNumberSchema.getMaximum(), providerNumberSchema.getMaximum())) {
errors.add(String.format(ERROR_FORMAT,
consumerNumberSchema.getId(),
"maximum",
consumerNumberSchema.getMaximum(),
providerNumberSchema.getMaximum()));
}

if (!equals(consumerNumberSchema.getMinimum(), providerNumberSchema.getMinimum())) {
errors.add(String.format(ERROR_FORMAT,
consumerNumberSchema.getId(),
"minimum",
consumerNumberSchema.getMinimum(),
providerNumberSchema.getMinimum()));
}

if (!equals(consumerNumberSchema.getMultipleOf(), providerNumberSchema.getMultipleOf())) {
errors.add(String.format(ERROR_FORMAT,
consumerNumberSchema.getId(),
"multipleOf",
consumerNumberSchema.getMultipleOf(),
providerNumberSchema.getMultipleOf()));
}

return errors;
}

@Override
public Class<?> supportsSchemaType() {
return NumberSchema.class;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,51 +4,58 @@
import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static com.hltech.vaunt.validator.JsonSchemaValidator.ERROR_FORMAT;
import static com.hltech.vaunt.validator.JsonSchemaValidator.ERROR_FORMAT_SHORT;
public class ObjectSchemaValidator extends ContainerTypeSchemaValidator {
private static final String UNMATCHING_SCHEMA_TYPE =
"Consumer schema with id %s and type %s does not match provider schema with id %s and name %s";

public class ObjectSchemaValidator {
@Override
public List<String> validate(JsonSchema consumerSchema, JsonSchema providerSchema) {
List<String> errors = super.validate(consumerSchema, providerSchema);

public static List<String> validate(ObjectSchema consumerSchema, ObjectSchema providerSchema) {
List<String> errors = new ArrayList<>(ContainerTypeSchemaValidator.validate(consumerSchema, providerSchema));
ObjectSchema consumerObjectSchema = consumerSchema.asObjectSchema();
ObjectSchema providerObjectSchema = providerSchema.asObjectSchema();

if (!equals(consumerSchema.getAdditionalProperties(), providerSchema.getAdditionalProperties())) {
if (!equals(consumerObjectSchema.getAdditionalProperties(), providerObjectSchema.getAdditionalProperties())) {
errors.add(String.format(ERROR_FORMAT_SHORT,
consumerSchema.getId(),
"additionalProperties"));
}

if (!equals(consumerSchema.getDependencies(), providerSchema.getDependencies())) {
if (!equals(consumerObjectSchema.getDependencies(), providerObjectSchema.getDependencies())) {
errors.add(String.format(ERROR_FORMAT,
consumerSchema.getId(),
"dependencies",
consumerSchema.getDependencies(),
providerSchema.getDependencies()));
consumerObjectSchema.getDependencies(),
providerObjectSchema.getDependencies()));
}

if (!equals(consumerSchema.getPatternProperties(), providerSchema.getPatternProperties())) {
if (!equals(consumerObjectSchema.getPatternProperties(), providerObjectSchema.getPatternProperties())) {
errors.add(String.format(ERROR_FORMAT,
consumerSchema.getId(),
"patternProperties",
mapToString(consumerSchema.getPatternProperties()),
mapToString(providerSchema.getPatternProperties())));
mapToString(consumerObjectSchema.getPatternProperties()),
mapToString(providerObjectSchema.getPatternProperties())));
}

errors.addAll(compareObjectProperties(
consumerSchema.getId(),
consumerSchema.getProperties(),
providerSchema.getProperties()));
consumerObjectSchema.getProperties(),
providerObjectSchema.getProperties()));

return errors;
}

private static List<String> compareObjectProperties(String id, Map<String, JsonSchema> consumerProperties,
@Override
public Class<ObjectSchema> supportsSchemaType() {
return ObjectSchema.class;
}

private List<String> compareObjectProperties(String id, Map<String, JsonSchema> consumerProperties,
Map<String, JsonSchema> providerProperties) {

if (!providerProperties.keySet().containsAll(consumerProperties.keySet())) {
Expand All @@ -61,25 +68,28 @@ private static List<String> compareObjectProperties(String id, Map<String, JsonS
}

return consumerProperties.keySet().stream()
.flatMap(key -> VauntSchemaValidator.validate(
consumerProperties.get(key), providerProperties.get(key)).stream())
.flatMap(key -> vslidateProperty(consumerProperties.get(key), providerProperties.get(key)).stream())
.collect(Collectors.toList());
}

private static boolean equals(Object object1, Object object2) {
if (object1 == null) {
return object2 == null;
} else {
return object1.equals(object2);
}
private List<String> vslidateProperty(JsonSchema consumerProperty, JsonSchema providerProperty) {
return consumerProperty.getClass() == providerProperty.getClass()
? VauntSchemaValidator.validate(consumerProperty, providerProperty)
: Lists.newArrayList(String.format(
UNMATCHING_SCHEMA_TYPE,
consumerProperty.getId(),
consumerProperty.getClass().getSimpleName(),
providerProperty.getId(),
providerProperty.getClass().getSimpleName()));
}

private static String mapToString(Map<String, JsonSchema> props) {
int max = props.size() - 1;
if (max == -1) {
private String mapToString(Map<String, JsonSchema> props) {
if (props.isEmpty()) {
return "{}";
}

int max = props.size() - 1;

StringBuilder sb = new StringBuilder();
Iterator<Map.Entry<String, JsonSchema>> it = props.entrySet().iterator();

Expand All @@ -96,8 +106,4 @@ private static String mapToString(Map<String, JsonSchema> props) {
sb.append(", ");
}
}

private static String jsonToString(JsonSchema object) {
return "JsonSchema(id=" + object.getId() + ")";
}
}
Loading

0 comments on commit 542bedf

Please sign in to comment.