[ 
https://issues.apache.org/jira/browse/CONFIGURATION-442?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13017563#comment-13017563
 ] 

Oliver Heger commented on CONFIGURATION-442:
--------------------------------------------

Thanks for the clearification.

In this case I would suggest that you switch from {{ConfigurationFactory}} to 
{{DefaultConfigurationBuilder}}. {{DefaultConfigurationBuilder}} is intended to 
be a full replacement for {{ConfigurationFactory}}. Its API is very similar, 
and it can process the same configuration definition files. It provides some 
more features and internally converts all configurations to hierarchical ones. 
More information is available in the user's guide at 
http://commons.apache.org/configuration/userguide/howto_configurationbuilder.html.
 This should solve the problems with iterating over the keys of the sub 
configuration.

Because {{DefaultConfigurationBuilder}} is more powerful than 
{{ConfigurationFactory}}, we will probably deprecate the latter at some point 
of time. (And we certainly have to update our documentation to emphasize this.) 
Therefore I am not too keen to fix this bug if the alternative I suggested 
works for you.

> 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