[ 
https://issues.apache.org/jira/browse/CONFIGURATION-677?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16275963#comment-16275963
 ] 

Piotr Skowronek commented on CONFIGURATION-677:
-----------------------------------------------

Thanks for the comment.

My two cents - I think that there is kinda design flaw regarding 
"allowFailOnInit".
Firstly, it is only configurable via C-tor which then requires parameters to be 
given to C-tor. This then brakes DSL way of building ConfigurationBuilder using 
BasicConfigurationBuilder#configure().
Secondly, there should be a mechanism to state where the configuration should 
be saved (to hint the upstream) + a priority hierarchy for chained/combined 
configurations.
This sounds like an enhancement to properly support configuration creation in 
user defined places.


For future reference, this is a workaround where HomeDirectoryLocationStrategy 
can be used and the configuration file will created if needed:
{code}
        HomeDirectoryLocationStrategy location = new 
HomeDirectoryLocationStrategy();
        File configFile = new File(location.getHomeDirectory(), 
".some.config"); // let HomeDirectoryLocationStrategy work out the parent path
        BuilderParameters params = new Parameters().properties()
                .setFile(configFile)   // use setFile to set the full path
                .setEncoding("UTF-8");
        builder = new FileBasedConfigurationBuilder<FileBasedConfiguration>(
                PropertiesConfiguration.class, params.getParameters(), true);
        builder.setAutoSave(true);
        config = builder.getConfiguration();
        config.setProperty("test", "test);
{code}

> FileBasedConfigurationBuilder allowFailOnInit vs HomeDirectoryLocationStrategy
> ------------------------------------------------------------------------------
>
>                 Key: CONFIGURATION-677
>                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-677
>             Project: Commons Configuration
>          Issue Type: Bug
>          Components: Documentation, File reloading
>    Affects Versions: 2.2
>         Environment: macOS Sierra 10.12.6, Java 1.8.0_152
>            Reporter: Piotr Skowronek
>             Fix For: 2.x
>
>
> It seems there's a problem with configuration creation when using 
> FileBasedConfigurationBuilder with allowFailOnInit together with 
> HomeDirectoryLocationStrategy and autoSave option.
> If the configuration is present in user.home directory (let's say 
> ~/.some.config) it is being loaded and updated properly, but if the file does 
> *not exist* then the configuration is created in current working directory 
> (where the java program was launched) and *not* in user home directory.
> Javadoc of BasicConfigurationBuilder states as follows:
> {quote}A builder instance can be constructed with an <em>allowFailOnInit</em>
>  * flag. If set to <strong>true</strong>, exceptions during initialization
>  * of the configuration are ignored; in such a case an empty configuration
>  * object is returned. A use case for this flag is a scenario in which a
>  * configuration is optional and created on demand the first time 
> configuration
>  * data is to be stored. Consider an application that stores user-specific
>  * configuration data in the user's home directory: When started for the first
>  * time by a new user there is no configuration file; so it makes sense to
>  * start with an empty configuration object. On application exit, settings
>  * can be stored in this object and written to the associated file. Then they
>  * are available on next application start.
> {quote}
> So, either it is a bug and it should be fixed in the Configuration project or 
> it is the correct behavior and it is the programmer to ensure to write the 
> configuration in the right place for the first time. If the latter then I 
> would suggest to update javadoc to state that clearly enough (and maybe 
> provide an example on the project website).
> Code sample:
> {code}
>         // file not present: ~/.some.config
>         BuilderParameters params = new 
> Parameters().properties().setFileName(".some.config")
>             .setLocationStrategy(new HomeDirectoryLocationStrategy());
>         builder = new 
> FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class,
>  params.getParameters(), true);
>         builder.setAutoSave(true);
>         config = builder.getConfiguration();
>         config.setProperty("test", "test);
>         // config file .some.config not present in ~/.some.config but present 
> in CWD
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to