use of org.simpleflatmapper.datastax.impl.setter.ListWithConverterSettableDataSetter in project SimpleFlatMapper by arnaudroger.
the class SettableDataSetterFactory method getSetter.
@SuppressWarnings("unchecked")
@Override
public <P> Setter<SettableByIndexData, P> getSetter(PropertyMapping<?, ?, DatastaxColumnKey, ? extends ColumnDefinition<DatastaxColumnKey, ?>> arg) {
Setter<SettableByIndexData, P> setter = null;
Type propertyType = arg.getPropertyMeta().getPropertyType();
final DataType dataType = arg.getColumnKey().getDataType();
Type type = dataType != null ? DataTypeHelper.asJavaClass(dataType) : null;
if (type == null) {
type = propertyType;
}
if (TypeHelper.isEnum(propertyType)) {
if (TypeHelper.areEquals(type, String.class)) {
return (Setter<SettableByIndexData, P>) new StringEnumSettableDataSetter(arg.getColumnKey().getIndex());
} else {
return (Setter<SettableByIndexData, P>) new OrdinalEnumSettableDataSetter(arg.getColumnKey().getIndex());
}
}
SetterFactory<SettableByIndexData, PropertyMapping<?, ?, DatastaxColumnKey, ? extends ColumnDefinition<DatastaxColumnKey, ?>>> setterFactory = this.factoryPerClass.get(TypeHelper.toClass(type));
if (setterFactory != null) {
setter = setterFactory.getSetter(arg);
if (!TypeHelper.areEquals(TypeHelper.toBoxedClass(type), TypeHelper.toBoxedClass(propertyType))) {
Converter<?, ?> converter = getConverter(propertyType, TypeHelper.toClass(type), dataType, arg.getColumnDefinition());
if (converter != null) {
setter = (Setter<SettableByIndexData, P>) new ConvertDelegateSetter<SettableByIndexData, Object, P>(setter, (Converter<Object, P>) converter);
} else {
setter = null;
}
}
}
if (setter == null && dataType != null) {
if (dataType instanceof UserType) {
if (propertyType.equals(UDTValue.class)) {
setter = (Setter<SettableByIndexData, P>) new UDTValueSettableDataSetter(arg.getColumnKey().getIndex());
} else {
setter = (Setter<SettableByIndexData, P>) UDTObjectSettableDataSetter.newInstance(propertyType, (UserType) dataType, arg.getColumnKey().getIndex(), mapperConfig, reflectionService);
}
} else if (TypeHelper.isAssignable(List.class, type) && TypeHelper.isAssignable(List.class, propertyType)) {
DataType dataTypeElt = dataType.getTypeArguments().get(0);
Class<?> dEltType = DataTypeHelper.asJavaClass(dataTypeElt);
Type lEltType = TypeHelper.getComponentTypeOfListOrArray(propertyType);
if (TypeHelper.areEquals(lEltType, dEltType)) {
setter = new ListSettableDataSetter(arg.getColumnKey().getIndex());
} else {
Converter<?, ?> converter = getConverter(lEltType, dEltType, dataTypeElt, arg.getColumnDefinition());
if (converter != null) {
setter = new ListWithConverterSettableDataSetter(arg.getColumnKey().getIndex(), converter);
}
}
} else if (TypeHelper.isAssignable(Set.class, type) && TypeHelper.isAssignable(Set.class, propertyType)) {
DataType dataTypeElt = dataType.getTypeArguments().get(0);
Class<?> dEltType = DataTypeHelper.asJavaClass(dataTypeElt);
Type lEltType = TypeHelper.getComponentTypeOfListOrArray(propertyType);
if (TypeHelper.areEquals(lEltType, dEltType)) {
setter = new SetSettableDataSetter(arg.getColumnKey().getIndex());
} else {
Converter<?, ?> converter = getConverter(lEltType, dEltType, dataTypeElt, arg.getColumnDefinition());
if (converter != null) {
setter = new SetWithConverterSettableDataSetter(arg.getColumnKey().getIndex(), converter);
}
}
} else if (TypeHelper.isAssignable(Map.class, type) && TypeHelper.isAssignable(Map.class, propertyType)) {
DataType dtKeyType = dataType.getTypeArguments().get(0);
DataType dtValueType = dataType.getTypeArguments().get(1);
TypeHelper.MapEntryTypes keyValueTypeOfMap = TypeHelper.getKeyValueTypeOfMap(propertyType);
if (areSame(dtKeyType, keyValueTypeOfMap.getKeyType()) && areSame(dtValueType, keyValueTypeOfMap.getValueType())) {
setter = new MapSettableDataSetter(arg.getColumnKey().getIndex());
} else {
setter = new MapWithConverterSettableDataSetter(arg.getColumnKey().getIndex(), getConverter(keyValueTypeOfMap.getKeyType(), DataTypeHelper.asJavaClass(dtKeyType), dtKeyType, arg.getColumnDefinition()), getConverter(keyValueTypeOfMap.getValueType(), DataTypeHelper.asJavaClass(dtValueType), dtValueType, arg.getColumnDefinition()));
}
}
}
return setter;
}
Aggregations