private static Optional<Method> findWither(TypeInformation<?> owner, String propertyName, Class<?> rawType) { AtomicReference<Method> resultHolder = new AtomicReference<>(); String methodName = String.format("with%s", StringUtils.capitalize(propertyName)); ReflectionUtils.doWithMethods(owner.getType(), it -> { if (owner.isAssignableFrom(owner.getReturnType(it))) { resultHolder.set(it); } }, it -> isMethodWithSingleParameterOfType(it, methodName, rawType)); Method method = resultHolder.get(); return method != null ? Optional.of(method) : Optional.empty(); }
@Override public boolean isAssignableFrom(TypeInformation<?> target) { if (this.equals(target)) { return true; } Class<T> rawType = getType(); Class<?> rawTargetType = target.getType(); if (!rawType.isAssignableFrom(rawTargetType)) { return false; } TypeInformation<?> otherTypeInformation = rawType.equals(rawTargetType) ? target : target .getSuperTypeInformation(rawType); List<TypeInformation<?>> myParameters = getTypeArguments(); List<TypeInformation<?>> typeParameters = otherTypeInformation.getTypeArguments(); if (myParameters.size() != typeParameters.size()) { return false; } for (int i = 0; i < myParameters.size(); i++) { if (!myParameters.get(i).isAssignableFrom(typeParameters.get(i))) { return false; } } return true; }
@Override public boolean isAssignableFrom(TypeInformation<?> target) { if (this.equals(target)) { return true; } Class<T> rawType = getType(); Class<?> rawTargetType = target.getType(); if (!rawType.isAssignableFrom(rawTargetType)) { return false; } TypeInformation<?> otherTypeInformation = rawType.equals(rawTargetType) ? target : target.getSuperTypeInformation(rawType); List<TypeInformation<?>> myParameters = getTypeArguments(); List<TypeInformation<?>> typeParameters = otherTypeInformation == null ? Collections.emptyList() : otherTypeInformation.getTypeArguments(); if (myParameters.size() != typeParameters.size()) { return false; } for (int i = 0; i < myParameters.size(); i++) { if (!myParameters.get(i).isAssignableFrom(typeParameters.get(i))) { return false; } } return true; }
private DataType getDataType(CassandraMappingContext mappingContext, TypeInformation<?> typeInformation, CassandraPersistentProperty property) { DataType dataType = mappingContext.getDataType(property); if (property.isCollectionLike() && !typeInformation.isCollectionLike()) { if (dataType instanceof CollectionType) { CollectionType collectionType = (CollectionType) dataType; if (collectionType.getTypeArguments().size() == 1) { return collectionType.getTypeArguments().get(0); } } } if (!property.isCollectionLike() && typeInformation.isCollectionLike()) { if (typeInformation.isAssignableFrom(SET)) { return DataType.set(dataType); } return DataType.list(dataType); } if (property.isMap()) { if (dataType instanceof CollectionType) { CollectionType collectionType = (CollectionType) dataType; if (collectionType.getTypeArguments().size() == 2) { return collectionType.getTypeArguments().get(0); } } } return mappingContext.getDataType(property); }