private static boolean isSupported()

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);
      }
    }
  }