Hi Nick,
you are right, this is indeed a problem in 1.10.
DefaultConfigurationBuilder extends XMLConfiguration; therefore, setting
the default expression engine affects the way keys are resolved.
The preferred way to set the expression engine for the combined
configuration produced by the builder is to declare the desired engine
in the definition file that is loaded. There is an example in the user's
guide [1] in the sub section "The header section"
In the upcoming version 2.0, this problem should no longer exist. Here
different mechanisms are used for setting a default expression engine
and for constructing a combined configuration. I hope that a first alpha
release of Commons Configuration 2.0 will be available soon.
So, as the problem will be solved in the next version, it probably does
not make sense to open a Jira ticket.
Oliver
[1]
http://commons.apache.org/proper/commons-configuration/userguide/howto_configurationbuilder.html#Configuration_definition_file_reference
On 11.09.2014 21:37, Nick Watts wrote:
Hello, I've run into a problem that looks to me like a bug. I thought I'd
get some input on it first though.
Here are two JUnit test cases that both pass with Commons Config 1.10:
import static org.junit.Assert.*;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationBuilder;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.DefaultConfigurationBuilder;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.configuration.tree.DefaultExpressionEngine;
import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
import org.apache.commons.jxpath.JXPathException;
import org.junit.Before;
public class Test {
@Before
public void before() {
HierarchicalConfiguration.setDefaultExpressionEngine(new
DefaultExpressionEngine());
}
@org.junit.Test
public void testSetExpressionEngineAfterLoad() throws
ConfigurationException {
ConfigurationBuilder builder = new
DefaultConfigurationBuilder("configuration_builder.xml");
((XMLConfiguration)builder).setBasePath("src/test/resources/");
Configuration config = builder.getConfiguration();
HierarchicalConfiguration.setDefaultExpressionEngine(new
XPathExpressionEngine());
assertEquals("mail.test.org", config.getString("mail/host"));
assertEquals("r...@test.org", config.getString("mail/from"));
assertEquals("otheru...@test.org", config.getString("mail/to"));
assertEquals("that...@test.org", config.getString("mail/cc"));
assertEquals("", config.getString("mail/bcc"));
}
@org.junit.Test(expected=JXPathException.class)
public void testSetExpressionEngineBeforeLoad() {
try {
HierarchicalConfiguration.setDefaultExpressionEngine(new
XPathExpressionEngine());
ConfigurationBuilder builder = new
DefaultConfigurationBuilder("configuration_builder.xml");
((XMLConfiguration)builder).setBasePath("src/test/resources/");
builder.getConfiguration();
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
}
The configuration_builder.xml file:
<?xml version="1.0" encoding="ISO-8859-1"?>
<configuration>
<override>
<xml fileName="dev.config.xml" config-name="env-config" />
<xml fileName="config.xml" config-name="default-config" />
</override>
</configuration>
the config.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<mail>
<host>mail.test.org</host>
<from>r...@test.org</from>
<to>nwa...@test.org</to>
<cc/>
<bcc/>
</mail>
</config>
the dev.config.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<mail>
<to>otheru...@test.org</to>
<cc>that...@test.org</cc>
</mail>
</config>
The possible bug is that the call to
HierarchicalConfiguration.setDefaultExpressionEngine(new
XPathExpressionEngine()) must come after the call to
builder.getConfiguration(). If it precedes builder.getConfiguration() then
you get this stack trace:
org.apache.commons.jxpath.JXPathException: Invalid XPath:
'[@systemProperties]'. Syntax error at the beginning of the expression
at org.apache.commons.jxpath.ri.Parser.parseExpression(Parser.java:60)
at
org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.compileExpression(JXPathContextReferenceImpl.java:218)
at
org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.iteratePointers(JXPathContextReferenceImpl.java:529)
at
org.apache.commons.jxpath.JXPathContext.selectNodes(JXPathContext.java:654)
at
org.apache.commons.configuration.tree.xpath.XPathExpressionEngine.query(XPathExpressionEngine.java:183)
at
org.apache.commons.configuration.HierarchicalConfiguration.fetchNodeList(HierarchicalConfiguration.java:958)
at
org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.fetchNodeList(AbstractHierarchicalFileConfiguration.java:439)
at
org.apache.commons.configuration.HierarchicalConfiguration.getProperty(HierarchicalConfiguration.java:344)
at
org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.getProperty(AbstractHierarchicalFileConfiguration.java:392)
at
org.apache.commons.configuration.AbstractConfiguration.resolveContainerStore(AbstractConfiguration.java:1171)
at
org.apache.commons.configuration.AbstractConfiguration.getString(AbstractConfiguration.java:1038)
at
org.apache.commons.configuration.AbstractConfiguration.getString(AbstractConfiguration.java:1021)
at
org.apache.commons.configuration.DefaultConfigurationBuilder.initSystemProperties(DefaultConfigurationBuilder.java:793)
at
org.apache.commons.configuration.DefaultConfigurationBuilder.getConfiguration(DefaultConfigurationBuilder.java:612)
at
org.apache.commons.configuration.DefaultConfigurationBuilder.getConfiguration(DefaultConfigurationBuilder.java:587)
at Test.testSetExpressionEngineBeforeLoad(Test.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
The XPath expression "[@systemProperties]" is hard-coded in the class
DefaultConfigurationBuilder as the static field named KEY_SYSTEM_PROPS. It
appears that this hard-coded value means that DefaultConfigurationBuilder
is not considering that different expression engines can be used. This
problem is easily solved by just waiting to set the expression engine until
after the configuration files have been loaded but I'm not sure what
happens if you have automatic reloading turned on or do other reloading
down the line. Should this be logged in JIRA as a defect or am I just
overlooking some information?
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org