check(T,TypeCallback)   F
last analyzed

Complexity

Conditions 17

Size

Total Lines 41
Code Lines 41

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 41
dl 0
loc 41
c 0
b 0
f 0
cc 17
rs 1.8

How to fix   Complexity   

Complexity

Complex classes like es.webbeta.serializer.TypeChecker.check(T,TypeCallback) often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
package es.webbeta.serializer;
2
3
import es.webbeta.serializer.base.SerializerMetadataProvider;
4
import es.webbeta.serializer.base.TypeCallback;
5
6
import java.io.IOException;
7
import java.math.BigDecimal;
8
import java.math.BigInteger;
9
import java.util.Date;
10
import java.util.Map;
11
import java.util.UUID;
12
13
public class TypeChecker {
14
15
    private SerializerMetadataProvider provider;
16
17
    public TypeChecker(SerializerMetadataProvider provider) {
18
        this.provider = provider;
19
    }
20
21
    public <T> Boolean isByte(T value) {
22
        return value instanceof Byte;
23
    }
24
25
    public <T> Boolean isShort(T value) {
26
        return value instanceof Short;
27
    }
28
29
    public <T> Boolean isInteger(T value) {
30
        return value instanceof Integer;
31
    }
32
33
    public <T> Boolean isBigInteger(T value) {
34
        return value instanceof BigInteger;
35
    }
36
37
    public <T> Boolean isLong(T value) {
38
        return value instanceof Long;
39
    }
40
41
    public <T> Boolean isFloat(T value) {
42
        return value instanceof Float;
43
    }
44
45
    public <T> Boolean isDouble(T value) {
46
        return value instanceof Double;
47
    }
48
49
    public <T> Boolean isBigDecimal(T value) {
50
        return value instanceof BigDecimal;
51
    }
52
53
    public <T> Boolean isNumeric(T value) {
54
        return isByte(value) ||
55
                isShort(value) ||
56
                isInteger(value) ||
57
                isBigInteger(value) ||
58
                isLong(value) ||
59
                isFloat(value) ||
60
                isDouble(value) ||
61
                isBigDecimal(value);
62
    }
63
64
    public <T> Boolean isString(T value) {
65
        return value instanceof String;
66
    }
67
68
    public <T> Boolean isStringParseable(T value) {
69
        return value instanceof Enum<?> || value instanceof UUID;
70
    }
71
72
    public <T> Boolean isBoolean(T value) {
73
        return value instanceof Boolean;
74
    }
75
76
    public <T> Boolean isDate(T value) {
77
        return value instanceof Date;
78
    }
79
80
    public <T> Boolean isSerializableObject(T value) {
81
        return !(value instanceof Iterable) && provider.canProvide(value.getClass());
82
    }
83
84
    public <T> Boolean isUnserializableObject(T value) {
85
        return !isNumeric(value) &&
86
                !isString(value) &&
87
                !isStringParseable(value) &&
88
                !isBoolean(value) &&
89
                !isDate(value) &&
90
                !isIterable(value) &&
91
                !isMap(value) &&
92
                !provider.canProvide(value.getClass());
93
    }
94
95
    public <T> Boolean isIterable(T value) {
96
        return value instanceof Iterable;
97
    }
98
99
    public <T> Boolean isMap(T value) {
100
        return value instanceof Map;
101
    }
102
103
    public <T> void check(T value, TypeCallback callback) throws IOException {
104
        if (isByte(value)) {
105
            callback.itsByte((Byte) value);
106
            callback.itsNumeric(value);
107
        } else if (isShort(value)) {
108
            callback.itsShort((Short) value);
109
            callback.itsNumeric(value);
110
        } else if (isInteger(value)) {
111
            callback.itsInteger((Integer) value);
112
            callback.itsNumeric(value);
113
        } else if (isBigInteger(value)) {
114
            callback.itsBigInteger((BigInteger) value);
115
            callback.itsNumeric(value);
116
        } else if (isLong(value)) {
117
            callback.itsLong((Long) value);
118
            callback.itsNumeric(value);
119
        } else if (isFloat(value)) {
120
            callback.itsFloat((Float) value);
121
            callback.itsNumeric(value);
122
        } else if (isDouble(value)) {
123
            callback.itsDouble((Double) value);
124
            callback.itsNumeric(value);
125
        } else if (isBigDecimal(value)) {
126
            callback.itsBigDecimal((BigDecimal) value);
127
            callback.itsNumeric(value);
128
        } else if (isString(value)) {
129
            callback.itsString((String) value);
130
        } else if (isStringParseable(value))
131
            callback.itsStringParseable(value);
132
        else if (isBoolean(value))
133
            callback.itsBoolean((Boolean) value);
134
        else if (isDate(value))
135
            callback.itsDate((Date) value);
136
        else if (isUnserializableObject(value))
137
            callback.itsUnserializableObject(value);
138
        else if (isSerializableObject(value))
139
            callback.itsSerializableObject(value);
140
        else if (isIterable(value))
141
            callback.itsIterable((Iterable<?>) value);
142
        else if (isMap(value))
143
            callback.itsMap((Map<?, ?>) value);
144
    }
145
146
}
147