commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Oliver Heger (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CONFIGURATION-442) SubsetConfiguration does not properly list attributes when a delimiter is set
Date Fri, 08 Apr 2011 17:36:06 GMT

    [ 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

Mime
View raw message