[ https://issues.apache.org/jira/browse/CONFIGURATION-442?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Oliver Heger resolved CONFIGURATION-442. ---------------------------------------- Resolution: Won't Fix Fix Version/s: 1.7 There is a workaround for this problem. > 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 > Fix For: 1.7 > > > 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