Thanks for the pointer to the documentation. I missed that section somehow.
Also, I appreciate the explanation of how this problem is being resolved in
the 2.0 release. I configured the XPathExpressionEngine in the config
definition file and that solved my problem.

On Fri, Sep 12, 2014 at 9:46 AM, Oliver Heger <[email protected]>
wrote:

> 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("[email protected]", config.getString("mail/from"));
>>          assertEquals("[email protected]", config.getString("mail/to"));
>>          assertEquals("[email protected]", 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>[email protected]</from>
>>          <to>[email protected]</to>
>>          <cc/>
>>          <bcc/>
>>      </mail>
>> </config>
>>
>> the dev.config.xml file:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <config>
>>      <mail>
>>          <to>[email protected]</to>
>>          <cc>[email protected]</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.AbstractHierarchicalFileConfig
>> uration.fetchNodeList(AbstractHierarchicalFileConfiguration.java:439)
>>      at
>> org.apache.commons.configuration.HierarchicalConfiguration.getProperty(
>> HierarchicalConfiguration.java:344)
>>      at
>> org.apache.commons.configuration.AbstractHierarchicalFileConfig
>> uration.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: [email protected]
> For additional commands, e-mail: [email protected]
>
>


-- 
Nick Watts
blog: thewonggei.wordpress.com
twitter: @thewonggei

Reply via email to