commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Emmanuel Bourg (JIRA)" <j...@apache.org>
Subject [jira] Issue Comment Edited: (CONFIGURATION-271) BaseConfiguration duplicates multi value keys values
Date Wed, 27 Feb 2008 09:04:51 GMT

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


Mime
View raw message