You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Emmanuel Bourg (JIRA)" <ji...@apache.org> on 2008/02/27 10:04:51 UTC

[jira] Issue Comment Edited: (CONFIGURATION-271) BaseConfiguration duplicates multi value keys values

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

ebourg edited comment on CONFIGURATION-271 at 2/27/08 1:04 AM:
-----------------------------------------------------------------------

I guess you merge the files by loading twice the same configuration instance ? Something like this :
\\
{code:java}
INIConfiguration config = new INIConfiguration();
config.load("file1.ini");
config.load("file2.ini");
config.save("file1.ini");
{code}

Multi value properties have a list semantic and not a set semantic (i.e no duplicates), this is not something that can be changed. The best is to use another method to merge your properties. Here is an example of a function merging 2 configurations and eliminating redundant values :
\\
{code:java}
    public void merge(Configuration source, Configuration target)
    {
        Iterator keys = source.getKeys();
        while (keys.hasNext())
        {
            String key = (String) keys.next();

            Object value1 = source.getProperty(key);
            Object value2 = target.getProperty(key);

            if (value2 == null) {
                target.setProperty(key, value1);
            } else {
                Set values = new HashSet();
                
                if (value1 instanceof Collection) {
                    values.addAll((Collection) value1);
                } else {
                    values.add(value1);
                }
                
                if (value2 instanceof Collection) {
                    values.addAll((Collection) value2);
                } else {
                    values.add(value2);
                }

                target.setProperty(key, values);
            }
        }
    }
{code}

      was (Author: ebourg):
    I guess you merge the files by loading twice the same configuration instance ? Something like this :

INIConfiguration config = new INIConfiguration();
config.load("file1.ini");
config.load("file2.ini");
config.save("file1.ini");

Multi value properties have a list semantic and not a set semantic (i.e no duplicates), this is not something that can be changed. The best is to use another method to merge your properties. Here is an example of a function merging 2 configurations and eliminating redundant values :

    public void merge(Configuration source, Configuration target)
    {
        Iterator keys = source.getKeys();
        while (keys.hasNext())
        {
            String key = (String) keys.next();

            Object value1 = source.getProperty(key);
            Object value2 = target.getProperty(key);

            if (value2 == null) {
                target.setProperty(key, value1);
            } else {
                Set values = new HashSet();
                
                if (value1 instanceof Collection) {
                    values.addAll((Collection) value1);
                } else {
                    values.add(value1);
                }
                
                if (value2 instanceof Collection) {
                    values.addAll((Collection) value2);
                } else {
                    values.add(value2);
                }

                target.setProperty(key, values);
            }
        }
    }
  
> BaseConfiguration duplicates multi value keys values
> ----------------------------------------------------
>
>                 Key: CONFIGURATION-271
>                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-271
>             Project: Commons Configuration
>          Issue Type: New Feature
>    Affects Versions: 1.4
>            Reporter: Daniel Adrian
>            Priority: Minor
>             Fix For: 1.6
>
>
> In addPropertyDirect(String key, Object value) the method adds the new value to the property.
> If the property has the same value in the list, it will get duplicated.
> The method should check if the list contains the value and only if the result is false add the value. 
> There is no logic in saving a multi value key with more than one instance of a value.

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