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