com.hltech.pact.gen.domain.pact.PojoExtractor   A
last analyzed

Complexity

Total Complexity 22

Size/Duplication

Total Lines 111
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 68
dl 0
loc 111
rs 10
c 0
b 0
f 0
wmc 22

15 Methods

Rating   Name   Duplication   Size   Complexity  
A PojoExtractor() 0 1 1
A extractPojosFromRequestProperties(ClientMethodRepresentation) 0 3 1
A extractPojosFromResponseProperties(ClientMethodRepresentation) 0 7 1
A extractPojoTypes(ClientMethodRepresentation) 0 9 1
A extractTypesFromBody(Body) 0 11 3
A isFromJdk(Class) 0 2 1
A collectNestedTypes(Collection) 0 5 1
A isPrimitive(Class) 0 2 1
A isNotBasicJavaType(Class) 0 2 1
A isArrayOfPrimitives(Class) 0 2 1
A getTypesOfFields(Class) 0 5 1
A extractNestedTypes(Class) 0 20 5
A isNotEnum(Class) 0 2 1
A isArrayOfNonprimitives(Class) 0 2 1
A extractNestedTypes(Collection) 0 9 2
1
package com.hltech.pact.gen.domain.pact;
2
3
import com.hltech.pact.gen.domain.client.model.Body;
4
import com.hltech.pact.gen.domain.client.model.ClientMethodRepresentation;
5
import org.springframework.util.CollectionUtils;
6
7
import java.lang.reflect.Field;
8
import java.util.Arrays;
9
import java.util.Collection;
10
import java.util.HashSet;
11
import java.util.Set;
12
import java.util.stream.Collectors;
13
14
final class PojoExtractor {
15
16
    private PojoExtractor() {}
17
18
    static Set<Class<?>> extractPojoTypes(ClientMethodRepresentation methodRepresentation) {
19
        Set<Class<?>> pojoClasses = new HashSet<>();
20
21
        pojoClasses.addAll(extractPojosFromRequestProperties(methodRepresentation));
22
        pojoClasses.addAll(extractPojosFromResponseProperties(methodRepresentation));
23
24
        return pojoClasses.stream()
25
            .filter(clazz -> clazz != void.class)
26
            .collect(Collectors.toSet());
27
    }
28
29
    private static Set<Class<?>> extractPojosFromRequestProperties(ClientMethodRepresentation methodRepresentation) {
30
        return new HashSet<>(
31
            extractTypesFromBody(methodRepresentation.getRequestRepresentation().getBody()));
32
    }
33
34
    private static Set<Class<?>> extractPojosFromResponseProperties(ClientMethodRepresentation methodRepresentation) {
35
        Set<Class<?>> pojoClasses = new HashSet<>();
36
37
        methodRepresentation.getResponseRepresentationList().forEach(responseProperties ->
38
            pojoClasses.addAll(extractTypesFromBody(responseProperties.getBody())));
39
40
        return pojoClasses;
41
    }
42
43
    private static Set<Class<?>> extractTypesFromBody(Body body) {
44
        Set<Class<?>> typesFromBody = new HashSet<>();
45
46
        if (body.getType() != null) {
47
            typesFromBody.add(body.getType());
48
        }
49
        if (!CollectionUtils.isEmpty(body.getGenericArgumentTypes())) {
50
            typesFromBody.addAll(body.getGenericArgumentTypes());
51
        }
52
53
        return extractNestedTypes(typesFromBody);
54
    }
55
56
    private static Set<Class<?>> extractNestedTypes(Collection<Class<?>> classes) {
57
        return classes.stream()
58
            .map(PojoExtractor::extractNestedTypes)
59
            .flatMap(Collection::stream)
60
            .map(clazz -> isArrayOfNonprimitives(clazz) ? clazz.getComponentType() : clazz)
61
            .filter(clazz -> !isArrayOfPrimitives(clazz))
62
            .filter(PojoExtractor::isNotBasicJavaType)
63
            .filter(PojoExtractor::isNotEnum)
64
            .collect(Collectors.toSet());
65
    }
66
67
    private static Set<Class<?>> extractNestedTypes(Class<?> clazz) {
68
        Class<?> baseClass = clazz;
69
        Set<Class<?>> nestedClasses = new HashSet<>();
70
71
        if (isArrayOfPrimitives(baseClass)) {
72
            return nestedClasses;
73
        }
74
75
        if (isArrayOfNonprimitives(baseClass)) {
76
            baseClass = clazz.getComponentType();
77
        }
78
79
        if (isNotBasicJavaType(baseClass) && isNotEnum(baseClass)) {
80
            nestedClasses.add(baseClass);
81
            Set<Class<?>> typesOfFields = getTypesOfFields(baseClass);
82
            nestedClasses.addAll(typesOfFields);
83
            nestedClasses.addAll(collectNestedTypes(typesOfFields));
84
        }
85
86
        return nestedClasses;
87
    }
88
89
    private static Set<Class<?>> getTypesOfFields(Class<?> clazz) {
90
        return Arrays.stream(clazz.getDeclaredFields())
91
            .filter(field -> !field.isSynthetic())
92
            .map(Field::getType)
93
            .collect(Collectors.toSet());
94
    }
95
96
    private static Set<Class<?>> collectNestedTypes(Collection<Class<?>> classes) {
97
        return classes.stream()
98
            .map(PojoExtractor::extractNestedTypes)
99
            .flatMap(Collection::stream)
100
            .collect(Collectors.toSet());
101
    }
102
103
    private static boolean isNotBasicJavaType(Class<?> clazz) {
104
        return !isPrimitive(clazz) && !isFromJdk(clazz);
105
    }
106
107
    private static boolean isPrimitive(Class<?> clazz) {
108
        return clazz.isPrimitive();
109
    }
110
111
    private static boolean isFromJdk(Class<?> clazz) {
112
        return clazz.getPackage().getName().startsWith("java");
113
    }
114
115
    private static boolean isNotEnum(Class<?> clazz) {
116
        return !clazz.isEnum();
117
    }
118
119
    private static boolean isArrayOfPrimitives(Class<?> clazz) {
120
        return clazz.isArray() && clazz.getComponentType().isPrimitive();
121
    }
122
123
    private static boolean isArrayOfNonprimitives(Class<?> clazz) {
124
        return clazz.isArray() && !clazz.getComponentType().isPrimitive();
125
    }
126
}
127