package com.netflix.governator.lifecycle;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Map;
import com.google.common.collect.Maps;
import com.netflix.governator.annotations.Configuration;
import com.netflix.governator.annotations.ConfigurationVariable;
import com.netflix.governator.configuration.ConfigurationDocumentation;
import com.netflix.governator.configuration.ConfigurationMapper;
import com.netflix.governator.configuration.ConfigurationProvider;
public class DefaultConfigurationMapper implements ConfigurationMapper {
@Override
public void mapConfiguration(
ConfigurationProvider configurationProvider,
ConfigurationDocumentation configurationDocumentation,
Object obj,
LifecycleMethods methods) throws Exception {
/**
* Map a configuration to any field with @Configuration annotation
*/
Field[] configurationFields = methods.annotatedFields(Configuration.class);
if (configurationFields.length > 0) {
/**
* Any field annotated with @ConfigurationVariable will be available for replacement when generating
* property names
*/
final Map<String, String> overrides;
Field[] configurationVariableFields = methods.annotatedFields(ConfigurationVariable.class);
if (configurationVariableFields.length > 0) {
overrides = Maps.newHashMap();
for (Field variableField : configurationVariableFields) {
ConfigurationVariable annot = variableField.getAnnotation(ConfigurationVariable.class);
if (annot != null) {
overrides.put(annot.name(), methods.fieldGet(variableField, obj).toString());
}
}
}
else {
overrides = Collections.emptyMap();
}
ConfigurationProcessor configurationProcessor = new ConfigurationProcessor(configurationProvider,
configurationDocumentation);
for (Field configurationField : configurationFields) {
try {
configurationProcessor.assignConfiguration(obj, configurationField, overrides);
} catch (Exception e) {
throw new Exception(String.format("Failed to bind property '%s' for instance of '%s'",
configurationField.getName(), obj.getClass().getCanonicalName()), e);
}
}
}
}
}