[ 
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)

Reply via email to