
io.gridgo.utils.pojo.setter.fieldconverters.KeyValueFieldConverter Maven / Gradle / Ivy
package io.gridgo.utils.pojo.setter.fieldconverters;
import java.util.HashMap;
import io.gridgo.utils.exception.UnsupportedTypeException;
import io.gridgo.utils.pojo.PojoMethodSignature;
import io.gridgo.utils.pojo.exception.PojoProxyException;
import io.gridgo.utils.pojo.setter.data.GenericData;
import io.gridgo.utils.pojo.setter.data.KeyValueData;
public class KeyValueFieldConverter implements GenericDataConverter, FieldConverter {
private static final KeyValueFieldConverter INSTANCE = new KeyValueFieldConverter();
public static KeyValueFieldConverter getInstance() {
return INSTANCE;
}
private KeyValueFieldConverter() {
// Nothing to do
}
@Override
public Object convert(KeyValueData data, PojoMethodSignature signature) {
if (signature.isMapType())
return keyValueToMap(data, signature);
if (signature.isPojoType())
return fromKeyValue(data, signature.getFieldType(), signature.getSetterProxy());
throw new PojoProxyException(
"Cannot convert non key-value data to incompatible type: " + signature.getFieldType());
}
private Object keyValueToMap(KeyValueData data, PojoMethodSignature signature) {
var map = new HashMap();
for (var entry : data) {
var value = toMapValue(entry.getValue(), signature);
map.put(entry.getKey(), value);
}
return map;
}
private Object toMapValue(GenericData data, PojoMethodSignature signature) {
var genericTypes = signature.getGenericTypes();
var valueType = (genericTypes != null && genericTypes.length > 1) ? genericTypes[1] : Object.class;
if (valueType == Object.class || data.isSequence() || data.isReference())
return data.getInnerValue();
if (data.isPrimitive())
return data.asPrimitive().getDataAs(valueType);
if (data.isKeyValue())
return fromKeyValue(data.asKeyValue(), valueType, signature.getElementSetterProxy());
throw new UnsupportedTypeException("Unknown entry value type: " + data.getClass());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy