[ https://issues.apache.org/jira/browse/CONFIGURATION-756?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gary Gregory updated CONFIGURATION-756: --------------------------------------- Description: 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 consumer used in {{PropertiesConfiguration}} by introducing a functional interface to consume any type and throw {{ConfigurationException}}: {code:java} /** * A Configuration task that may throw a ConfigurationException. * * @param <T> the type of the input to the operation. * @since 2.6 */ @FunctionalInterface public interface ConfigurationConsumer<T> { /** * Performs this operation on the given argument. * * @param t the input argument * @throws ConfigurationException TODO */ void accept(T t) throws ConfigurationException; } {code} The above is the common pattern when you need a consumer to throw a checked exception. The {{PropertiesConfiguration}} default behavior does not change and is implemented as: {code:java} /** * Defines default error handling for the special {@code "include"} key by throwing the given exception. * * @since 2.6 */ public static final ConfigurationConsumer<ConfigurationException> DEFAULT_INCLUDE_LISTENER = e -> { throw e; }; {code} In addition, a noop implementation is provided for simple use cases and tests: {code:java} /** * Defines error handling as a noop for the special {@code "include"} key. * * @since 2.6 */ public static final ConfigurationConsumer<ConfigurationException> NOOP_INCLUDE_LISTENER = e -> { // 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}}. was: 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. * I am reworking the whole PR ATM, please hold... * [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}}. > 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 consumer used in {{PropertiesConfiguration}} by > introducing a functional interface to consume any type and throw > {{ConfigurationException}}: > {code:java} > /** > * A Configuration task that may throw a ConfigurationException. > * > * @param <T> the type of the input to the operation. > * @since 2.6 > */ > @FunctionalInterface > public interface ConfigurationConsumer<T> > { > /** > * Performs this operation on the given argument. > * > * @param t the input argument > * @throws ConfigurationException TODO > */ > void accept(T t) throws ConfigurationException; > } > {code} > The above is the common pattern when you need a consumer to throw a checked > exception. > The {{PropertiesConfiguration}} default behavior does not change and is > implemented as: > {code:java} > /** > * Defines default error handling for the special {@code "include"} key > by throwing the given exception. > * > * @since 2.6 > */ > public static final ConfigurationConsumer<ConfigurationException> > DEFAULT_INCLUDE_LISTENER = e -> > { > throw e; > }; > {code} > In addition, a noop implementation is provided for simple use cases and tests: > {code:java} > /** > * Defines error handling as a noop for the special {@code "include"} key. > * > * @since 2.6 > */ > public static final ConfigurationConsumer<ConfigurationException> > NOOP_INCLUDE_LISTENER = e -> > { > // 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)