[
https://issues.apache.org/jira/browse/CONFIGURATION-442?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13017490#comment-13017490
]
Fabien Nisol commented on CONFIGURATION-442:
--------------------------------------------
The test was just to point you to the good direction. We don't directly
instanciate a SubsetConfiguration, it is done if it happens that your base
configuration is a CompositeConfiguration
example:
{code}
public class SimpleTest
{
public static void main(String[] args)
{
try
{
ConfigurationFactory factory = new
ConfigurationFactory("config.xml");
Configuration config = factory.getConfiguration();
String prefix = "prop1.prop2.prop";
Configuration subconf = config.subset(prefix);
System.out.printf("%s (%s) content:%n",subconf.getClass(),prefix);
ConfigurationUtils.dump(subconf,System.out);
System.out.println();
} catch (ConfigurationException e)
{
e.printStackTrace();
}
}
}
{code}
{code:title=config.xml}
<configuration>
<system/>
<xml fileName="test.xml"/>
</configuration>
{code}
{code:title=test.xml}
<properties>
<prop1>
<prop2>
<prop
attr1="${user.home}"
attr2="attr2"
/>
</prop2>
</prop1>
</properties>
{code}
executing the test gives the following result:
{code:title=stdout}
class org.apache.commons.configuration.SubsetConfiguration (prop1.prop2.prop)
content:
@attr1]=null
@attr2]=null
{code}
Since ConfigurationUtils lists the keys through the getKeys() method
{code:title=ConfigurationUtils.java::dump()}
public static void dump(Configuration configuration, PrintWriter out)
{
Iterator keys = configuration.getKeys();
while (keys.hasNext())
{
String key = (String) keys.next();
Object value = configuration.getProperty(key);
out.print(key);
out.print("=");
out.print(value);
if (keys.hasNext())
{
out.println();
}
}
out.flush();
}
{code}
So there is definitely a bug in the getKeys() implementation, which is of no
use if someone tries to use it. (Which is our case by the way)
> 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