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

com.yammer.dropwizard.config.ConfigurationFactory Maven / Gradle / Ivy

package com.yammer.dropwizard.config;

import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
import com.google.common.io.Files;
import com.yammer.dropwizard.validation.Validator;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.error.YAMLException;
import org.yaml.snakeyaml.introspector.BeanAccess;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;

public class ConfigurationFactory {
    public static  ConfigurationFactory forClass(Class klass, Validator validator) {
        return new ConfigurationFactory(klass, validator);
    }

    private final Class klass;
    private final Validator validator;

    public ConfigurationFactory(Class klass, Validator validator) {
        this.klass = klass;
        this.validator = validator;
    }
    
    public T build(File file) throws IOException, ConfigurationException, YAMLException {
        final BufferedReader reader = Files.newReader(file, Charsets.UTF_8);
        try {
            final Yaml yaml = buildYamlParser();
            final T config = loadYaml(reader, yaml);
            validate(file, config);
            return config;
        } finally {
            reader.close();
        }
    }

    private T defaultInstance() {
        try {
            return klass.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private void validate(File file, T config) throws ConfigurationException {
        final ImmutableList errors = validator.validate(config);
        if (!errors.isEmpty()) {
            throw new ConfigurationException(file, errors);
        }
    }

    @SuppressWarnings("unchecked")
    private T loadYaml(BufferedReader reader, Yaml yaml) {
        final T config = (T) yaml.load(reader);
        if (config == null) {
            return defaultInstance();
        }
        return config;
    }

    private Yaml buildYamlParser() {
        final Yaml yaml = new Yaml(new Constructor(klass));
        yaml.setBeanAccess(BeanAccess.FIELD);
        return yaml;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy