InterpolatedDeserializer.java

package io.github.giulong.spectrum.internals.jackson.deserializers.interpolation;

import static java.util.Comparator.comparing;

import java.util.List;
import java.util.Optional;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonDeserializer;

import io.github.giulong.spectrum.internals.jackson.deserializers.interpolation.interpolators.Interpolator;
import io.github.giulong.spectrum.utils.Configuration;
import io.github.giulong.spectrum.utils.Configuration.Config;
import io.github.giulong.spectrum.utils.Reflections;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public abstract class InterpolatedDeserializer<T> extends JsonDeserializer<T> {

    private final Configuration configuration = Configuration.getInstance();

    @SneakyThrows
    public String interpolate(final String value, final JsonParser jsonParser) {
        final Config config = configuration.getConfig();
        final String currentName = jsonParser.currentName();
        log.trace("{} is deserializing {}: {}", getClass().getSimpleName(), currentName, value);

        if (config != null) {
            final List<Interpolator> interpolators = Reflections.getFieldsValueOf(config.getInterpolators());
            final String interpolatedValue = interpolators
                    .stream()
                    .filter(Interpolator::isEnabled)
                    .sorted(comparing(Interpolator::getPriority).reversed())
                    .map(i -> i.findVariableFor(value, jsonParser))
                    .filter(Optional::isPresent)
                    .map(Optional::get)
                    .findFirst()
                    .orElse(value);

            log.debug("Chosen value: {} -> {}", currentName, interpolatedValue);
            return interpolatedValue;
        }

        return value;
    }

    @SneakyThrows
    public String interpolate(final JsonParser jsonParser) {
        return interpolate(jsonParser.getValueAsString(), jsonParser);
    }
}