All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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