SubsetConfiguration does not properly list attributes when a delimiter is set
-----------------------------------------------------------------------------

                 Key: CONFIGURATION-442
                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-442
             Project: Commons Configuration
          Issue Type: Bug
    Affects Versions: 1.6
         Environment: all
            Reporter: Fabien Nisol


imagine a XmlConfiguration like this:
{code}
<properties>
  <prop1>
    <prop2>
      <prop
         attr1="attr1"
         attr2="attr2"/>
    </prop2>
  </prop1>
</properties>
{code}

If subset get instanciated to the end of the hierarchy, with a specific 
delimiter, getKeys() won't return the correct keys:

{code}
...
XMLConfiguration config = new XMLConfiguration("test/test.xml");
Configuration subset = new SubsetConfiguration(config,"prop1.prop2.prop",".");
ConfigurationUtils.dump(subset, System.err);
...
{code}

gives the result:

{code}
@attr1]=null
@attr2]=null
{code}

it should give the result

{code}
[@attr1]=attr1
[@attr2]=attr2
{code}

The wrong dump is a side effect of the wrong implementation of the 
_getChildKey_ method of SubsetConfiguration

{code}
 /**
     * Return the key in the subset configuration associated to the specified
     * key in the parent configuration.
     *
     * @param key The key in the parent configuration.
     * @return the key in the context of this subset configuration
     */
    protected String getChildKey(String key)
    {
        if (!key.startsWith(prefix))
        {
            throw new IllegalArgumentException("The parent key '" + key + "' is 
not in the subset.");
        }
        else
        {
            String modifiedKey = null;
            if (key.length() == prefix.length())
            {
                modifiedKey = "";
            }
            else
            {
                int i = prefix.length() + (delimiter != null ? 
delimiter.length() : 0);
                modifiedKey = key.substring(i);
            }

            return modifiedKey;
        }
    }
{code}

In this code, the _else_ part is wrong. In a hierarchical configuration, the 
attribute delimiter is '[' and is removed here.

I think a more correct code would be :

{code}
/**
     * Return the key in the subset configuration associated to the specified
     * key in the parent configuration.
     *
     * @param key The key in the parent configuration.
     * @return the key in the context of this subset configuration
     */
    protected String getChildKey(String key)
    {
        if (!key.startsWith(prefix))
        {
            throw new IllegalArgumentException("The parent key '" + key + "' is 
not in the subset.");
        }
        else
        {
            String modifiedKey = null;
            if (key.length() == prefix.length())
            {
                modifiedKey = "";
            }
            else
            {
                modifiedKey = key.substring(prefix.length());
                if(delimiter!=null && modifiedKey.startsWith(delimiter))
                {
                    modifiedKey=modifiedKey.substring(delimiter.length());
                }
            }

            return modifiedKey;
        }
    }

{code}



--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to