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  }