public JavaType apply(JavaType item) { for (Map.Entry<JavaType, JavaType> enty : GENERIC_MAPPINGS.entrySet()) { JavaType value = enty.getValue(); if (value.equals(item)) { return enty.getKey(); } } return item; } }, UNWRAP {
public static boolean isSet(JavaType type) { return type.equals(SET) || type.getInterfaces().contains(SET); } }
public static boolean isMap(JavaType type) { return type.equals(MAP) || type.getInterfaces().contains(MAP); }
public static boolean isList(JavaType type) { return type.equals(LIST) || type.getInterfaces().contains(LIST); }
private JavaType replaceGenericWith(JavaType source, JavaType from, JavaType to) { List<JavaType> generics = Arrays.asList(source.getGenericTypes()); if (generics.isEmpty()) { return source; } else if (source.equals(from)) { return to; } else { List<JavaType> updatedGenerics = new ArrayList<JavaType>(); for (JavaType generic : generics) { updatedGenerics.add(replaceGenericWith(generic, from, to)); } return new JavaTypeBuilder(source).withGenericTypes(updatedGenerics.toArray(new JavaType[generics.size()])).build(); } } }
public JavaType apply(JavaType type) { Set<JavaType> interfaces = new LinkedHashSet<JavaType>(); Set<JavaType> generics = new LinkedHashSet<JavaType>(); if (GENERIC_MAPPINGS.containsValue(type)) { JavaType unmapped = UNMAP.apply(type); if (!unmapped.equals(type)) { return UNWRAP.apply(unmapped); } return unmapped; } else { for (JavaType iface : type.getInterfaces()) { interfaces.add(UNWRAP.apply(iface)); } for (JavaType generic : type.getGenericTypes()) { generics.add(UNWRAP.apply(generic)); } return new JavaTypeBuilder(type) .withGenericTypes(generics.toArray(new JavaType[generics.size()])) .withInterfaces(interfaces) .build(); } } };
/** * Checks if a type is an descendant of an other type * @param item The base type. * @param candidate The candidate type. * @return true if candidate is a descendant of base type. */ public static boolean isDescendant(JavaType item, JavaType candidate) { if (item == null || candidate == null) { return false; } else if (item.equals(candidate)) { return true; } else if (isDescendant(item.getSuperClass(), candidate)) { return true; } else { for (JavaType interfaceType : item.getInterfaces()) { if (isDescendant(interfaceType, candidate)) { return true; } } return false; } }