private TypeCodec maybeCreateCodec()

in src/java/org/apache/cassandra/cql3/functions/types/CodecRegistry.java [711:783]


    private <T> TypeCodec<T> maybeCreateCodec(DataType cqlType, TypeToken<T> javaType)
    {
        checkNotNull(cqlType);

        if (cqlType.getName() == LIST
            && (javaType == null || List.class.isAssignableFrom(javaType.getRawType())))
        {
            TypeToken<?> elementType = null;
            if (javaType != null && javaType.getType() instanceof ParameterizedType)
            {
                Type[] typeArguments = ((ParameterizedType) javaType.getType()).getActualTypeArguments();
                elementType = TypeToken.of(typeArguments[0]);
            }
            TypeCodec<?> eltCodec = findCodec(cqlType.getTypeArguments().get(0), elementType);
            return (TypeCodec<T>) TypeCodec.list(eltCodec);
        }

        if (cqlType.getName() == SET
            && (javaType == null || Set.class.isAssignableFrom(javaType.getRawType())))
        {
            TypeToken<?> elementType = null;
            if (javaType != null && javaType.getType() instanceof ParameterizedType)
            {
                Type[] typeArguments = ((ParameterizedType) javaType.getType()).getActualTypeArguments();
                elementType = TypeToken.of(typeArguments[0]);
            }
            TypeCodec<?> eltCodec = findCodec(cqlType.getTypeArguments().get(0), elementType);
            return (TypeCodec<T>) TypeCodec.set(eltCodec);
        }

        if (cqlType.getName() == MAP
            && (javaType == null || Map.class.isAssignableFrom(javaType.getRawType())))
        {
            TypeToken<?> keyType = null;
            TypeToken<?> valueType = null;
            if (javaType != null && javaType.getType() instanceof ParameterizedType)
            {
                Type[] typeArguments = ((ParameterizedType) javaType.getType()).getActualTypeArguments();
                keyType = TypeToken.of(typeArguments[0]);
                valueType = TypeToken.of(typeArguments[1]);
            }
            TypeCodec<?> keyCodec = findCodec(cqlType.getTypeArguments().get(0), keyType);
            TypeCodec<?> valueCodec = findCodec(cqlType.getTypeArguments().get(1), valueType);
            return (TypeCodec<T>) TypeCodec.map(keyCodec, valueCodec);
        }

        if (cqlType instanceof VectorType
            && (javaType == null || List.class.isAssignableFrom(javaType.getRawType())))
        {
            VectorType type = (VectorType) cqlType;
            return (TypeCodec<T>) TypeCodec.vector(type, findCodec(type.getSubtype(), null));
        }

        if (cqlType instanceof TupleType
            && (javaType == null || TupleValue.class.isAssignableFrom(javaType.getRawType())))
        {
            return (TypeCodec<T>) TypeCodec.tuple((TupleType) cqlType);
        }

        if (cqlType instanceof UserType
            && (javaType == null || UDTValue.class.isAssignableFrom(javaType.getRawType())))
        {
            return (TypeCodec<T>) TypeCodec.userType((UserType) cqlType);
        }

        if (cqlType instanceof DataType.CustomType
            && (javaType == null || ByteBuffer.class.isAssignableFrom(javaType.getRawType())))
        {
            return (TypeCodec<T>) TypeCodec.custom((DataType.CustomType) cqlType);
        }

        return null;
    }