View Javadoc
1   package net.sumaris.server.http.graphql.technical;
2   
3   /*-
4    * #%L
5    * SUMARiS:: Server
6    * %%
7    * Copyright (C) 2018 - 2019 SUMARiS Consortium
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
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  }