lenny
lenny

Reputation: 3138

Apache Commons Configuration validate properties file

I am using Apache Commons Configuration library with PropertiesConfiguration. My application loads the config file right after its started, like this:

public PropertiesConfiguration loadConfigFile(File configFile) throws ConfigurationNotFoundException {
        try {
            if (configFile != null && configFile.exists()) {
                config.load(configFile);
                config.setListDelimiter(';');
                config.setAutoSave(true);
                config.setReloadingStrategy(new FileChangedReloadingStrategy());
                setConfigLoaded(true);
            }
            else {
                throw new ConfigurationNotFoundException("Configuration file not found.");
            }

        } catch (ConfigurationException e) {
            logger.warn(e.getMessage());
            setDefaultConfigValues(config);
            config.setFile(configFile);
        }
        return config;
}

My question is, how can I validate the configFile, so I can be sure that no property in that file is missing and later in my code I won't get a NullPointerException when trying to access the properties, e.g.:

PropertiesConfiguration config = loadConfig(configFile);
String rootDir = config.getString("paths.download"); // I want to be sure that this property exists right at the app start

I didn't found anything in the documentation or google, just something about XML validation.
The goal is to provide feedback to the user at program start that the configuration file is corrupted.
There is no build-in mechanism for properties-file?

Upvotes: 6

Views: 1813

Answers (2)

Geoff
Geoff

Reputation: 163

I ran into the exact same problem, so I made a small library for validating the entire configuration at once. It can be customized to suit the exact specifications that you need in your config.
It can be configured to work with any configuration library and currently comes with default support for Apache Commons Config and SnakeYAML.

It can be found here along with basic usage guides: https://github.com/TTNO1/ConfigValidation4j

Upvotes: 0

AGdev
AGdev

Reputation: 616

What is a configuration object supposed to do if you pass in a key to one of its get methods that does not map to an existing property?

  1. the default behavior as implemented in AbstractConfiguration is to return null if the return value is an object type.

  2. For primitive types as return values returning null (or any other special value) is not possible, so in this case a NoSuchElementException is thrown

    // This will return null if no property with key "NonExistingProperty" exists
    String strValue = config.getString("NonExistingProperty");
    
    // This will throw a NoSuchElementException exception if no property with
    // key "NonExistingProperty" exists
    long longValue = config.getLong("NonExistingProperty");
    

For object types like String, BigDecimal, or BigInteger this default behavior can be changed:

If the setThrowExceptionOnMissing() method is called with an argument of true, these methods will behave like their primitive counter parts and also throw an exception if the passed in property key cannot be resolved.

Situation is little tricky for Collection & array types as they will return empty collection or array.

Upvotes: 1

Related Questions