1 package net.sumaris.server.http.graphql.technical;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import io.leangen.geantyref.GenericTypeReflector;
26 import io.leangen.geantyref.TypeArgumentNotInBoundException;
27 import io.leangen.graphql.metadata.exceptions.TypeMappingException;
28 import io.leangen.graphql.metadata.strategy.type.TypeTransformer;
29 import io.leangen.graphql.util.ClassUtils;
30 import net.sumaris.core.dao.technical.model.IEntity;
31
32 import java.io.Serializable;
33 import java.lang.reflect.AnnotatedType;
34 import java.lang.reflect.Type;
35 import java.util.HashMap;
36 import java.util.Map;
37
38 public class DefaultTypeTransformer implements TypeTransformer {
39 private final AnnotatedType rawReplacement;
40 private final AnnotatedType unboundedReplacement;
41 private final Map<Type, AnnotatedType> unboundedReplacements = new HashMap<>();
42
43 public DefaultTypeTransformer(boolean replaceRaw, boolean replaceUnbounded) {
44 AnnotatedType replacement = GenericTypeReflector.annotate(Object.class);
45 this.rawReplacement = replaceRaw ? replacement : null;
46 this.unboundedReplacement = replaceUnbounded ? replacement : null;
47 }
48
49 public DefaultTypeTransformer(AnnotatedType rawReplacement, AnnotatedType unboundedReplacement) {
50 this.rawReplacement = rawReplacement;
51 this.unboundedReplacement = unboundedReplacement;
52 }
53
54 public DefaultTypeTransformer addUnboundedReplacement(Type type, Type unboundedReplacement) {
55 this.unboundedReplacements.put(type, GenericTypeReflector.annotate(unboundedReplacement));
56 return this;
57 }
58
59 public AnnotatedType transform(AnnotatedType type) throws TypeMappingException {
60 AnnotatedType unboundedReplacement = this.unboundedReplacements.get(type.getType());
61 if (unboundedReplacement != null) {
62 return ClassUtils.eraseBounds(type, unboundedReplacement);
63 }
64 try {
65 type = ClassUtils.eraseBounds(type, this.unboundedReplacement);
66 return ClassUtils.completeGenerics(type, this.rawReplacement);
67 } catch (TypeArgumentNotInBoundException e) {
68 throw e;
69 }
70 }
71 }