package cf.spring;
import org.springframework.core.env.PropertySource;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* @author Mike Heath
*/
public class YamlPropertySource extends PropertySource<YamlDocument> {
public YamlPropertySource(String name, YamlDocument source) {
super(name, source);
}
@Override
public Object getProperty(String name) {
try {
return findPropertyValue(name);
} catch (MissingValueException e) {
return null;
}
}
@Override
public boolean containsProperty(String name) {
try {
findPropertyValue(name);
return true;
} catch (MissingValueException e) {
return false;
}
}
private static MissingValueException MISSING_VALUE_EXCEPTION = new MissingValueException();
@SuppressWarnings("unchecked")
public Object findPropertyValue(String name) throws MissingValueException {
final List<String> names = Arrays.asList(name.split("\\."));
final Iterator<String> iterator = names.iterator();
Map<String, Object> values = getSource();
while (iterator.hasNext()) {
final String key = iterator.next();
if (!values.containsKey(key)) {
throw MISSING_VALUE_EXCEPTION;
}
if (iterator.hasNext()) {
final Object nestedValues = values.get(key);
if ((nestedValues instanceof Map)) {
values = (Map<String, Object>) nestedValues;
} else {
throw MISSING_VALUE_EXCEPTION;
}
} else {
return values.get(key);
}
}
throw MISSING_VALUE_EXCEPTION;
}
private static class MissingValueException extends Exception {}
}