[ https://issues.apache.org/jira/browse/CONFIGURATION-756?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gary Gregory updated CONFIGURATION-756: --------------------------------------- External issue ID: 34 External issue URL: https://github.com/apache/commons-configuration/pull/34 > Allow for custom behavior to handle errors loading included properties files. > ----------------------------------------------------------------------------- > > Key: CONFIGURATION-756 > URL: https://issues.apache.org/jira/browse/CONFIGURATION-756 > Project: Commons Configuration > Issue Type: New Feature > Reporter: Gary Gregory > Assignee: Gary Gregory > Priority: Major > > The properties file format in Commons Configuration allows for a properties > file to load external properties files through a special key called > {{"include"}}. This PR allows for a call site to customize what happens when > an included file does not exist or is in error. > https://github.com/apache/commons-configuration/pull/34 > The main change is to re-implement the current behavior for include error > handing through a new interface defined in {{PropertiesConfiguration}}: > {code:java} > /** > * Defines error handling for the special {@code "include"} key. > * > * @since 2.6 > */ > public interface IncludeListener > { > /** > * Defines what to do when an include file is missing. > * > * @param fileName the missing file name. > * @throws ConfigurationException Optionally thrown by the > implementation to stop processing. > */ > void onFileNotFound(String fileName) throws ConfigurationException; > /** > * Defines what to do when an exception is caught loading a property > file. > * > * @param e The exception. > * @throws ConfigurationException Optionally thrown by the > implementation to stop processing. > */ > void onLoadException(ConfigurationException e) throws > ConfigurationException; > } > {code} > Where the default behavior does not change and is implemented as: > {code:java} > /** > * Defines the default behavior. > * > * @since 2.6 > */ > public static class DefaultIncludeListener implements IncludeListener > { > /** > * The singleton instance. > */ > public static final DefaultIncludeListener INSTANCE = new > DefaultIncludeListener(); > @Override > public void onFileNotFound(final String fileName) throws > ConfigurationException > { > throw new ConfigurationException("Cannot resolve include file " + > fileName); > } > @Override > public void onLoadException(ConfigurationException e) throws > ConfigurationException > { > throw e; > } > } > {code} > In addition, a NOOP implementation is provided for simple use cases and tests: > {code:java} > /** > * Implements all methods as noops. > * > * @since 2.6 > */ > public static class NoopIncludeListener implements IncludeListener > { > /** > * The singleton instance. > */ > public static final NoopIncludeListener INSTANCE = new > NoopIncludeListener(); > @Override > public void onFileNotFound(final String fileName) throws > ConfigurationException > { > // noop > } > @Override > public void onLoadException(ConfigurationException e) throws > ConfigurationException > { > // noop > } > } > {code} > You can set an include listener through new methods in > {{PropertiesConfiguration}} and through the fluent API as well. See the PR > for details. > Note that this PR does not address detecting cyclical include files but does > include a new test method which is decorated with {{@Ignore}}. > -- This message was sent by Atlassian Jira (v8.3.2#803003)