I have been trying to register a custom configuration interpolator in the commons configuration that would take care of some fallback values by default.
Here is the code for interpolator.
public class FallbackConfigurationInterpolator extends ConfigurationInterpolator {
Pattern p = Pattern.compile("\\d+$");
public FallbackConfigurationInterpolator() {
super();
}
@Override
public String lookup(String var) {
String value = super.lookup(var);
if (StringUtils.startsWith(value, "${") && endsWithDigits(var)) {
value = super.lookup(valueWithRemovedDigits(var));
}
return value;
}
private String valueWithRemovedDigits(String var) {
return var.replace("\\d+$", StringUtils.EMPTY);
}
private boolean endsWithDigits(String var) {
return p.matcher(var).matches();
}
}
Here is how my configuration builder looks like
public class CustomCommonsConfigurationBuilder extends DefaultConfigurationBuilder {
public CustomCommonsConfigurationBuilder() {
super();
}
public CustomCommonsConfigurationBuilder(String fileName) throws ConfigurationException {
super(fileName);
}
public CustomCommonsConfigurationBuilder(File file) {
super(file);
}
public CustomCommonsConfigurationBuilder(URL url) throws ConfigurationException {
super(url);
}
@Override
protected ConfigurationInterpolator createInterpolator() {
FallbackConfigurationInterpolator interpol = new FallbackConfigurationInterpolator();
interpol.setDefaultLookup(new StrLookup() {
@Override
public String lookup(String var) {
Object prop = resolveContainerStore(var);
return (prop != null) ? prop.toString() : null;
}
});
return interpol;
}
}
Here is how i am instantiating my configuration builder.
@Before
public void setup() throws ConfigurationException {
System.setProperty("environment", "local");
config = (AbstractConfiguration) new CustomCommonsConfigurationBuilder("commons-configuration.xml")
.getConfiguration();
config.getSubstitutor().setEnableSubstitutionInVariables(true);
}
For some reason the lookup method in my custom interpolator is never called. Can someone please help if you've had success registering custom interpolators?
Thanks in Advance.