in java/fury-core/src/main/java/org/apache/fury/type/TypeUtils.java [627:666]
private static boolean isSupported(TypeRef<?> typeRef, LinkedHashSet<TypeRef> walkedTypePath) {
Class<?> cls = getRawType(typeRef);
if (!Modifier.isPublic(cls.getModifiers())) {
return false;
}
if (cls == Object.class) {
// return true for typeToken that point to un-specialized generic type, take it as a black
// box.
return true;
}
if (SUPPORTED_TYPES.contains(typeRef)) {
return true;
} else if (typeRef.isArray()) {
return isSupported(Objects.requireNonNull(typeRef.getComponentType()));
} else if (ITERABLE_TYPE.isSupertypeOf(typeRef)) {
boolean isSuperOfArrayList = cls.isAssignableFrom(ArrayList.class);
boolean isSuperOfHashSet = cls.isAssignableFrom(HashSet.class);
if ((!isSuperOfArrayList && !isSuperOfHashSet)
&& (cls.isInterface() || Modifier.isAbstract(cls.getModifiers()))) {
return false;
}
return isSupported(getElementType(typeRef));
} else if (MAP_TYPE.isSupertypeOf(typeRef)) {
boolean isSuperOfHashMap = cls.isAssignableFrom(HashMap.class);
if (!isSuperOfHashMap && (cls.isInterface() || Modifier.isAbstract(cls.getModifiers()))) {
return false;
}
Tuple2<TypeRef<?>, TypeRef<?>> mapKeyValueType = getMapKeyValueType(typeRef);
return isSupported(mapKeyValueType.f0) && isSupported(mapKeyValueType.f1);
} else {
if (walkedTypePath.contains(typeRef)) {
throw new UnsupportedOperationException(
"cyclic type is not supported. walkedTypePath: " + walkedTypePath);
} else {
LinkedHashSet<TypeRef> newTypePath = new LinkedHashSet<>(walkedTypePath);
newTypePath.add(typeRef);
return isBean(typeRef, newTypePath);
}
}
}