1

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.

mbellani
  • 31
  • 2

0 Answers0