Passed
Push — master ( 886a8d...e81f81 )
by Filip
02:36
created

validate(ObjectSchema,ObjectSchema)   A

Complexity

Conditions 4

Size

Total Lines 31
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 23
dl 0
loc 31
rs 9.328
c 1
b 0
f 0
1
package com.hltech.vaunt.validator;
2
3
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
4
import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
5
import com.google.common.collect.Lists;
6
7
import java.util.ArrayList;
8
import java.util.Iterator;
9
import java.util.List;
10
import java.util.Map;
11
import java.util.stream.Collectors;
12
13
import static com.hltech.vaunt.validator.JsonSchemaValidator.ERROR_FORMAT;
14
import static com.hltech.vaunt.validator.JsonSchemaValidator.ERROR_FORMAT_SHORT;
15
16
public class ObjectSchemaValidator {
17
18
    public static List<String> validate(ObjectSchema consumerSchema, ObjectSchema providerSchema) {
19
        List<String> errors = new ArrayList<>(ContainerTypeSchemaValidator.validate(consumerSchema, providerSchema));
20
21
        if (!equals(consumerSchema.getAdditionalProperties(), providerSchema.getAdditionalProperties())) {
22
            errors.add(String.format(ERROR_FORMAT_SHORT,
23
                    consumerSchema.getId(),
24
                    "additionalProperties"));
25
        }
26
27
        if (!equals(consumerSchema.getDependencies(), providerSchema.getDependencies())) {
28
            errors.add(String.format(ERROR_FORMAT,
29
                    consumerSchema.getId(),
30
                    "dependencies",
31
                    consumerSchema.getDependencies(),
32
                    providerSchema.getDependencies()));
33
        }
34
35
        if (!equals(consumerSchema.getPatternProperties(), providerSchema.getPatternProperties())) {
36
            errors.add(String.format(ERROR_FORMAT,
37
                    consumerSchema.getId(),
38
                    "patternProperties",
39
                    mapToString(consumerSchema.getPatternProperties()),
40
                    mapToString(providerSchema.getPatternProperties())));
41
        }
42
43
        errors.addAll(compareObjectProperties(
44
                consumerSchema.getId(),
45
                consumerSchema.getProperties(),
46
                providerSchema.getProperties()));
47
48
        return errors;
49
    }
50
51
    private static List<String> compareObjectProperties(String id, Map<String, JsonSchema> consumerProperties,
52
                                            Map<String, JsonSchema> providerProperties) {
53
54
        if (!providerProperties.keySet().containsAll(consumerProperties.keySet())) {
55
            return Lists.newArrayList(String.format(ERROR_FORMAT,
56
                    id,
57
                    "properties",
58
                    "ids of properties: " + consumerProperties.keySet(),
59
                    "ids of properties: " + providerProperties.keySet()
60
                    ));
61
        }
62
63
        return consumerProperties.keySet().stream()
64
                .flatMap(key -> VauntSchemaValidator.validate(
65
                        consumerProperties.get(key), providerProperties.get(key)).stream())
66
                .collect(Collectors.toList());
67
    }
68
69
    private static boolean equals(Object object1, Object object2) {
70
        if (object1 == null) {
71
            return object2 == null;
72
        } else {
73
            return object1.equals(object2);
74
        }
75
    }
76
77
    private static String mapToString(Map<String, JsonSchema> props) {
78
        int max = props.size() - 1;
79
        if (max == -1) {
80
            return "{}";
81
        }
82
83
        StringBuilder sb = new StringBuilder();
84
        Iterator<Map.Entry<String, JsonSchema>> it = props.entrySet().iterator();
85
86
        sb.append('{');
87
        for (int i = 0; ; i++) {
88
            Map.Entry<String, JsonSchema> entry = it.next();
89
            sb.append(entry.getKey());
90
            sb.append('=');
91
            sb.append(jsonToString(entry.getValue()));
92
93
            if (i == max) {
94
                return sb.append('}').toString();
95
            }
96
            sb.append(", ");
97
        }
98
    }
99
100
    private static String jsonToString(JsonSchema object) {
101
        return "JsonSchema(id=" + object.getId() + ")";
102
    }
103
}
104