
com.nhl.link.rest.parser.converter.PojoConverter Maven / Gradle / Ivy
package com.nhl.link.rest.parser.converter;
import com.fasterxml.jackson.databind.JsonNode;
import com.nhl.link.rest.meta.compiler.PropertySetter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
public class PojoConverter extends AbstractConverter {
private static final Logger LOGGER = LoggerFactory.getLogger(PojoConverter.class);
private final Class type;
private final Map setters;
private final Map> propertyConverters;
private final JsonValueConverter> defaultConverter;
// TODO: get rid of two maps (combine setter and converter in some interface, e.g. PropertyWriter)
public PojoConverter(Class type,
Map setters,
Map> propertyConverters,
JsonValueConverter defaultConverter) {
this.type = type;
this.setters = setters;
this.propertyConverters = propertyConverters;
this.defaultConverter = defaultConverter;
}
@Override
public T valueNonNull(JsonNode node) {
T object = newInstance(type);
node.fields().forEachRemaining(e -> {
String propertyName = e.getKey();
JsonNode value = e.getValue();
if (value.isNull() || value.isMissingNode()) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Skipping null/missing node: '{}'", propertyName);
}
return;
}
PropertySetter setter = setters.get(propertyName);
if (setter == null) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Skipping unknown property: '{}'", propertyName);
}
return;
}
JsonValueConverter> converter = getPropertyConverter(propertyName);
Object convertedValue = converter.value(value);
if (convertedValue != null) {
setter.setValue(object, convertedValue);
}
});
return object;
}
private JsonValueConverter> getPropertyConverter(String propertyName) {
return propertyConverters.getOrDefault(propertyName, defaultConverter);
}
private static T newInstance(Class type) {
try {
return type.newInstance();
} catch (Exception e) {
throw new RuntimeException("Failed to instantiate type: " + type.getName(), e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy