[ 
https://issues.apache.org/jira/browse/CONFIGURATION-280?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Oliver Heger resolved CONFIGURATION-280.
----------------------------------------

       Resolution: Fixed
    Fix Version/s: 1.5

Patch applied. A test case was also added.

Many thanks!

> autoSave and FileChangedReloadingStrategy corrupts configuration
> ----------------------------------------------------------------
>
>                 Key: CONFIGURATION-280
>                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-280
>             Project: Commons Configuration
>          Issue Type: Bug
>    Affects Versions: 1.4
>         Environment: Linux, Sun Java 5
>            Reporter: Roman Kurmanowytsch
>            Assignee: Oliver Heger
>             Fix For: 1.5
>
>         Attachments: autosave_reload.patch.txt
>
>
> First of all, sorry if this is not a bug. I may have missed some information 
> on how to make autoSave and FileChangedReloadingStrategy work.
> When a change has been detected by the FileChangedReloadingStrategy code, a 
> clear() followed by a load() is executed in the AbstractFileConfiguration 
> class (around line 809 of version 1.4). The clear() method leads to a 
> possiblySave() call which overwrites the configuration. At the end of the 
> clear() method, the configuration file is empty and the following load() 
> method loads this empty configuration. The possiblySave() call is invoked via 
> the work-around (according to the comment in the code) in 
> AbstractConfiguration (line 538).
> I'm using the following code:
> CompositeConfiguration config = new CompositeConfiguration();
> XMLConfiguration xmlconfig = new XMLConfiguration("config.xml");
> FileChangedReloadingStrategy fcrs = new FileChangedReloadingStrategy();
> xmlconfig.setReloadingStrategy(fcrs);
> config.addConfiguration(new SystemConfiguration());
> config.addConfiguration(xmlconfig);
> xmlconfig.setAutoSave(true);
> ...wait for config changes...         
> A workaround for the problem is to deactivate autoSave in the reload() method 
> of the AbstractFileConfiguration class. After the configuration is cleared 
> and loaded, the original autoSave is restored. See the diff below:
> 806a807,808
> >                         boolean autoSaveBak = this.isAutoSave(); // save 
> > the current state
> >                         this.setAutoSave(false); // deactivate autoSave to 
> > prevent information loss
> 813a816
> >                               this.setAutoSave(autoSaveBak); // set 
> > autoSave to previous value
> The code fragment looks like:
> --------------------------
>                     if (strategy.reloadingRequired())
>                     {
>                         if (getLogger().isInfoEnabled())
>                         {
>                             getLogger().info("Reloading configuration. URL is 
> " + getURL());
>                         }
>                         fireEvent(EVENT_RELOAD, null, getURL(), true);
>                         setDetailEvents(false);
>                         boolean autoSaveBak = this.isAutoSave(); // save the 
> current state
>                         this.setAutoSave(false); // deactivate autoSave to 
> prevent information loss
>                         try
>                         {
>                             clear();
>                             load();
>                         }
>                         finally
>                         {
>                                 this.setAutoSave(autoSaveBak); // set 
> autoSave to previous value
>                             setDetailEvents(true);
>                         }
>                         fireEvent(EVENT_RELOAD, null, getURL(), false);
>                         // notify the strategy
>                         strategy.reloadingPerformed();
>                     }
> --------------------------
> I hope this is a valid fix. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to