Issue Details (XML | Word | Printable)

Key: CONFIGURATION-336
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Major Major
Assignee: Oliver Heger
Reporter: Pavel Savara
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Commons Configuration

Brackets in property key causes NumberFormatException

Created: 29/Sep/08 07:49 AM   Updated: 22/Aug/09 07:36 PM
Return to search
Component/s: None
Affects Version/s: 1.5
Fix Version/s: 1.6

Time Tracking:
Not Specified

Resolution Date: 04/Nov/08 09:19 PM


 Description  « Hide
Hi,
When using brackets in property key we get an exception every time.
Escaping brackets with \ doesn't help.

Example
#property in property file
test(ef)=false

causes
java.lang.NumberFormatException: For input string: "ef" at
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:447)
at java.lang.Integer.parseInt(Integer.java:497)
at org.apache.commons.configuration.tree.DefaultConfigurationKey
$KeyIterator.checkIndex(DefaultConfigurationKey.java:834)
at org.apache.commons.configuration.tree.DefaultConfigurationKey
$KeyIterator.nextKey(DefaultConfigurationKey.java:511) at
org.apache.commons.configuration.tree.DefaultExpressionEngine.findNodesForKey(DefaultExpressionEngine.java:462) at
org.apache.commons.configuration.tree.DefaultExpressionEngine.query(DefaultExpressionEngine.java:286) at
org.apache.commons.configuration.HierarchicalConfiguration.fetchNodeList(HierarchicalConfiguration.java:925 at
org.apache.commons.configuration.HierarchicalConfiguration.setProperty(HierarchicalConfiguration.java:735) at
org.apache.commons.configuration.ConfigurationUtils.copy(ConfigurationUtils.java:143) at
org.apache.commons.configuration.ConfigurationUtils.convertToHierarchical(ConfigurationUtils.java:199) at org.apache.commons.configuration.CombinedConfiguration
$ConfigData.getTransformedRoot(CombinedConfiguration.java:794) at
org.apache.commons.configuration.CombinedConfiguration.constructCombinedNode(CombinedConfiguration.java:653) at
org.apache.commons.configuration.CombinedConfiguration.getRootNode(CombinedConfiguration.java:504) at
org.apache.commons.configuration.HierarchicalConfiguration.fetchNodeList(HierarchicalConfiguration.java:925) at
org.apache.commons.configuration.HierarchicalConfiguration.getProperty(HierarchicalConfiguration.java:327) at
org.apache.commons.configuration.CombinedConfiguration.getProperty(CombinedConfiguration.java:578) at
org.apache.commons.configuration.AbstractConfiguration.resolveContainerStore(AbstractConfiguration.java:1155) at
org.apache.commons.configuration.AbstractConfiguration.getString(AbstractConfiguration.java:1034) at
org.apache.commons.configuration.AbstractConfiguration.getString(AbstractConfiguration.java:1017)

Explanation i got in mailing list from Oliver Heger

I guess you use DefaultConfigurationBuilder for loading a combined
configuration?

The exception is due to the fact that brackets have a special meaning in
the query syntax for hierarchical configurations.
(DefaultConfigurationBuilder transforms all configuration sources into
hierarchical configurations, so also for properties, which are not
hierarchical by default, the same rules apply.)

So far escaping brackets or other specific characters in property keys
is not supported. It seems to be rather unusual to use brackets in
property keys, so you may well be the first one who noticed this problem.

Unfortunately I don't have a working solution for this problem right
now.



 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Oliver Heger added a comment - 30/Oct/08 07:24 AM
The problem is basically caused by the conversion of a flat Configuration (e.g. a PropertiesConfiguration) into a hierarchical one. Here all keys of the flat configuration are obtained and inserted into the new hierarchical configuration. The hierarchical configuration is initialized with a default expression engine that parses the property keys for brackets and tries to interpret their contents as index values. This fails in this specific case.

I think, a good solution for this problem would be to support using a specific ExpressionEngine when converting a flat configuration to a hierarchical one. If the property keys contain some critical characters like brackets, an expression engine could be used that is initialized with different index markers, e.g. square brackets.

To implement this solution at least two places have to be changed:

  • ConfigurationUtils needs an overloaded variant of the convertToHierarchical() method, which also expects an ExpressionEngine as parameter.
  • CombinedConfiguration should use its own expression engine when converting flat configurations to hierarchical ones. (This makes sense because this expression will also be used when querying the resulting combined configuration.)

Oliver Heger added a comment - 04/Nov/08 09:19 PM
It is now possible to specify an expression engine when converting a flat configuration to a hierarchical one. By using a properly configured expression engine you can work around the problem with property keys having a special meaning for the expression engine.

The applied fix contains two major changes:

  • There is an overloaded version of ConfigurationUtils.convertToHierarchical() that also expects an ExpressionEngine as argument.
  • CombinedConfiguration has the new conversionExpressionEngine property. The ExpressionEngine set here is used when the internal node structure is constructed.

In the unit test class for CombinedConfiguration a new test case was added (testConversionExpressionEngine() demonstrating how this new property can be used.