You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Andre Weihe <aw...@zmt.info> on 2012/12/05 16:32:39 UTC

[configuration] CombinedConfiguration#clone() not cloning changed properties

CombinedConfiguration#clone() does not clone properties set/changed on the CombinedConfiguration that are stored in combinedRoot (which seems NOT to be cloned).

Bug, feature or "You are using it wrong!"?


Demonstration program:
import org.apache.commons.configuration.*;
import org.apache.commons.configuration.tree.OverrideCombiner;
import java.util.Iterator;

public class CommonsConfigurationTester {
    private static final String FOO_KEY = "Test.foo";
    private static final String BAR_KEY = "Test.bar";

    public static void main(String[] args) {
        new CommonsConfigurationTester().ccTest();
    }

    void ccTest() {
        HierarchicalConfiguration defaultConfig = new HierarchicalConfiguration();
        defaultConfig.addProperty(FOO_KEY, Integer.valueOf(1));
        defaultConfig.addProperty(BAR_KEY, Integer.valueOf(2));

        System.out.println("Default config:\n" + configToString(defaultConfig));

        HierarchicalConfiguration individualConfig = new HierarchicalConfiguration();
        individualConfig.addProperty(FOO_KEY, Integer.valueOf(3));
        individualConfig.addProperty(BAR_KEY, Integer.valueOf(4));

        System.out.println("Individual config (has precedence):\n" + configToString(individualConfig));

        CombinedConfiguration combinedConfig = new CombinedConfiguration(new OverrideCombiner());
        combinedConfig.addConfiguration(individualConfig);
        combinedConfig.addConfiguration(defaultConfig);

        System.out.println("Combined config (default + individual):\n" + configToString(combinedConfig));

        combinedConfig.setProperty(FOO_KEY, Integer.valueOf(5));
        combinedConfig.setProperty(BAR_KEY, Integer.valueOf(6));

        System.out.println("Changed config (default + individual):\n" + configToString(combinedConfig));

        CombinedConfiguration combinedConfig2 = (CombinedConfiguration)combinedConfig.clone();

        System.out.println("Cloned changed config (default + individual):\n" + configToString(combinedConfig2));
    }


    /**
     * A little helper method to get all the settings of a configuration into a String
     * @param config the Configuration whose String representation we want
     * @return a String containing the key-value pairs
     */
    static String configToString(Configuration config) {
        String pairs = new String();
        for (Iterator keys = config.getKeys(); keys.hasNext();) {
            String key = (String)keys.next();
            pairs = pairs + key + '=' + config.getProperty(key) + '\n';
        }

        return pairs;
    }
}

-- 
Andr� Weihe                            Zengel Medizintechnik GmbH
Tel.:   +49-6136-9943925               Friedrich-Ebert-Str. 2
Fax.:   +49-6723-999598                65375 Oestrich-Winkel
                                       Gesch�ftsf�hrer: Grischa Zengel
E-Mail: awe@zmt.info                   Amtsgericht Wiesbaden HRB 23154
                                       Steuer-Nr.:       040 249 57267
                                       USt-IdNr.:          DE255806446




AW: [configuration] CombinedConfiguration#clone() not cloning changed properties

Posted by Andre Weihe <aw...@zmt.info>.
>-----Ursprüngliche Nachricht-----
>Von: Oliver Heger [mailto:oliver.heger@oliver-heger.de]
>Gesendet: Mittwoch, 5. Dezember 2012 21:52
>An: Commons Users List
>Betreff: Re: [configuration] CombinedConfiguration#clone() not cloning
>changed properties
>
>Am 05.12.2012 16:32, schrieb Andre Weihe:
>> CombinedConfiguration#clone() does not clone properties set/changed on
>the CombinedConfiguration that are stored in combinedRoot (which seems
>NOT to be cloned).
>>
>> Bug, feature or "You are using it wrong!"?
>
>Probably a kind of missing feature...

Could this feature be added in an upcoming version?

>This seems to be the same problem as for updates of a
>CombinedConfiguration as described in the user's guide [1].
>
>When the CombinedConfiguration is cloned, its nodes structure is not
>cloned, but only the list of child configurations. (From these
>configurations the nodes tree is constructed again.) If changes were
>made which could not be assigned to one of the source configurations,
>they are lost.

The changes made on the CombinedConfiguration instance (which are possible since the interfaces are present) are generally written to combinedRoot (even when matching keys are present in (a) source configuration(s)), and are visible/accessible on/from that instance.
Just not on the cloned instance.

>I guess, a specific strategy has to be defined how to handle updates of
>a CombinedConfiguration in general. Currently, it is certainly not
>ideal.

I'd suggest also cloning combinedRoot, and/or applying the changes on the configuration with the highest precedence, and/or stronger hints/advisories against using the mutators present in the interface of CombinedConfiguration in the JavaDocs even including warning/error messages during runtime (or compiletime?) when using the mutators present in the interface of CombinedConfiguration.


Best regards,
André


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org


Re: [configuration] CombinedConfiguration#clone() not cloning changed properties

Posted by Oliver Heger <ol...@oliver-heger.de>.
Am 05.12.2012 16:32, schrieb Andre Weihe:
> CombinedConfiguration#clone() does not clone properties set/changed on the CombinedConfiguration that are stored in combinedRoot (which seems NOT to be cloned).
>
> Bug, feature or "You are using it wrong!"?

Probably a kind of missing feature...

This seems to be the same problem as for updates of a 
CombinedConfiguration as described in the user's guide [1].

When the CombinedConfiguration is cloned, its nodes structure is not 
cloned, but only the list of child configurations. (From these 
configurations the nodes tree is constructed again.) If changes were 
made which could not be assigned to one of the source configurations, 
they are lost.

I guess, a specific strategy has to be defined how to handle updates of 
a CombinedConfiguration in general. Currently, it is certainly not ideal.

Oliver

[1] 
http://commons.apache.org/configuration/userguide/howto_combinedconfiguration.html#Dealing_with_changes
>
>
> Demonstration program:
> import org.apache.commons.configuration.*;
> import org.apache.commons.configuration.tree.OverrideCombiner;
> import java.util.Iterator;
>
> public class CommonsConfigurationTester {
>      private static final String FOO_KEY = "Test.foo";
>      private static final String BAR_KEY = "Test.bar";
>
>      public static void main(String[] args) {
>          new CommonsConfigurationTester().ccTest();
>      }
>
>      void ccTest() {
>          HierarchicalConfiguration defaultConfig = new HierarchicalConfiguration();
>          defaultConfig.addProperty(FOO_KEY, Integer.valueOf(1));
>          defaultConfig.addProperty(BAR_KEY, Integer.valueOf(2));
>
>          System.out.println("Default config:\n" + configToString(defaultConfig));
>
>          HierarchicalConfiguration individualConfig = new HierarchicalConfiguration();
>          individualConfig.addProperty(FOO_KEY, Integer.valueOf(3));
>          individualConfig.addProperty(BAR_KEY, Integer.valueOf(4));
>
>          System.out.println("Individual config (has precedence):\n" + configToString(individualConfig));
>
>          CombinedConfiguration combinedConfig = new CombinedConfiguration(new OverrideCombiner());
>          combinedConfig.addConfiguration(individualConfig);
>          combinedConfig.addConfiguration(defaultConfig);
>
>          System.out.println("Combined config (default + individual):\n" + configToString(combinedConfig));
>
>          combinedConfig.setProperty(FOO_KEY, Integer.valueOf(5));
>          combinedConfig.setProperty(BAR_KEY, Integer.valueOf(6));
>
>          System.out.println("Changed config (default + individual):\n" + configToString(combinedConfig));
>
>          CombinedConfiguration combinedConfig2 = (CombinedConfiguration)combinedConfig.clone();
>
>          System.out.println("Cloned changed config (default + individual):\n" + configToString(combinedConfig2));
>      }
>
>
>      /**
>       * A little helper method to get all the settings of a configuration into a String
>       * @param config the Configuration whose String representation we want
>       * @return a String containing the key-value pairs
>       */
>      static String configToString(Configuration config) {
>          String pairs = new String();
>          for (Iterator keys = config.getKeys(); keys.hasNext();) {
>              String key = (String)keys.next();
>              pairs = pairs + key + '=' + config.getProperty(key) + '\n';
>          }
>
>          return pairs;
>      }
> }
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org