Andrea Cosentino created CAMEL-7429:
---------------------------------------

             Summary: Camel Properties Component concatenation issue 
                 Key: CAMEL-7429
                 URL: https://issues.apache.org/jira/browse/CAMEL-7429
             Project: Camel
          Issue Type: Bug
          Components: camel-core
    Affects Versions: 2.12.3
         Environment: Linux Ubuntu 13.10, Windows 7
            Reporter: Andrea Cosentino


Hi,

Suppose you have a properties file of this type

{code}
#PROPERTIES CONCATENATION
prop1=file:
prop2=dirname
concat.property={{prop1}}{{prop2}}

#PROPERTIES WITHOUT CONCATENATION
property.complete=file:dirname
{code}

and you want to use the property concat.property. Using Camel 2.10.3 loading 
this property doesn't create any kind of problem. When I upgrade to Camel 
2.12.3 I get an exception, that you can reproduce with the following 
informations.

In *DefaultPropertiesParser* class of org.apache.camel.component.properties 
package, I found a strange behaviour relative to that specific kind of 
property.  When I execute a test like the following, (the first try to use 
concatenated property and the second try to use property without concatenation):

{code:title=PropertiesComponentConcatenatePropertiesTest.java}
import org.apache.camel.CamelContext;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.builder.RouteBuilder;

public class PropertiesComponentConcatenatePropertiesTest extends 
ContextTestSupport {
    
    @Override
    protected CamelContext createCamelContext() throws Exception {
        CamelContext context = super.createCamelContext();
        context.addComponent("properties", new 
PropertiesComponent("classpath:org/apache/camel/component/properties/concatenation.properties"));
        return context;
    }
    
    @Override
    protected void setUp() throws Exception {
        System.setProperty("environment", "junit");
        super.setUp();
    }
    
    @Override
    protected void tearDown() throws Exception {
        System.clearProperty("environment");
        super.tearDown();
    }
    
    public void testConcatPropertiesComponentDefault() throws Exception {
        context.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                
from("direct:start").setBody(simple("${properties:concat.property}"))
                .to("mock:result");
            }
        });
        context.start();

        getMockEndpoint("mock:result").expectedBodiesReceived("file:dirname");

        template.sendBody("direct:start", "Test");

        assertMockEndpointsSatisfied();
    }
    
    public void testWithoutConcatPropertiesComponentDefault() throws Exception {
        context.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                
from("direct:start").setBody(simple("${properties:property.complete}"))
                .to("mock:result");
            }
        });
        context.start();

        getMockEndpoint("mock:result").expectedBodiesReceived("file:dirname");

        template.sendBody("direct:start", "Test");

        assertMockEndpointsSatisfied();
    }
}
{code}

The first test return the following exception:
{code}
org.apache.camel.CamelExecutionException: Exception occurred during execution 
on the exchange: Exchange[Message: Test]
        at 
org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1379)
        at 
org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:622)
        at 
org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:467)
        at 
org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:463)
        at 
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:139)
        at 
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:144)
        at 
org.apache.camel.component.properties.PropertiesComponentConcatenatePropertiesTest.testConcatPropertiesComponentDefault(PropertiesComponentConcatenatePropertiesTest.java:56)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at junit.framework.TestCase.runTest(TestCase.java:176)
        at junit.framework.TestCase.runBare(TestCase.java:141)
        at org.apache.camel.TestSupport.runBare(TestSupport.java:58)
        at junit.framework.TestResult$1.protect(TestResult.java:122)
        at junit.framework.TestResult.runProtected(TestResult.java:142)
        at junit.framework.TestResult.run(TestResult.java:125)
        at junit.framework.TestCase.run(TestCase.java:129)
        at junit.framework.TestSuite.runTest(TestSuite.java:255)
        at junit.framework.TestSuite.run(TestSuite.java:250)
        at 
org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
        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)
Caused by: org.apache.camel.RuntimeCamelException: 
java.lang.IllegalArgumentException: Expecting }} but found end of string from 
text: prop1}}{{prop2
        at 
org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1363)
        at 
org.apache.camel.builder.ExpressionBuilder$78.evaluate(ExpressionBuilder.java:1784)
        at 
org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36)
        at 
org.apache.camel.builder.SimpleBuilder.evaluate(SimpleBuilder.java:83)
        at 
org.apache.camel.processor.SetBodyProcessor.process(SetBodyProcessor.java:46)
        at 
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398)
        at 
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
        at 
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at 
org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:51)
        at 
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at 
org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:73)
        at 
org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:378)
        at 
org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:1)
        at 
org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:242)
        at 
org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:346)
        at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:184)
        at 
org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:124)
        at 
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:137)
        ... 22 more
Caused by: java.lang.IllegalArgumentException: Expecting }} but found end of 
string from text: prop1}}{{prop2
        at 
org.apache.camel.component.properties.DefaultPropertiesParser.doParseUri(DefaultPropertiesParser.java:90)
        at 
org.apache.camel.component.properties.DefaultPropertiesParser.parseUri(DefaultPropertiesParser.java:51)
        at 
org.apache.camel.component.properties.DefaultPropertiesParser.parseUri(DefaultPropertiesParser.java:38)
        at 
org.apache.camel.component.properties.DefaultPropertiesParser.createPlaceholderPart(DefaultPropertiesParser.java:189)
        at 
org.apache.camel.component.properties.DefaultPropertiesParser.doParseUri(DefaultPropertiesParser.java:105)
        at 
org.apache.camel.component.properties.DefaultPropertiesParser.parseUri(DefaultPropertiesParser.java:51)
        at 
org.apache.camel.component.properties.PropertiesComponent.parseUri(PropertiesComponent.java:158)
        at 
org.apache.camel.component.properties.PropertiesComponent.parseUri(PropertiesComponent.java:117)
        at 
org.apache.camel.builder.ExpressionBuilder$78.evaluate(ExpressionBuilder.java:1781)
        ... 40 more
{code}

It seems that *DefaultPropertiesParser* don't like concatenation of properties. 
I've forked Camel project on GitHub and I've added the unit test posted above. 
Here is the link: https://github.com/ancosen/camel

Investigating the history of the particular class I found that the problem 
should arise from:
 *CAMEL-5328 supports resolution of nested properties in PropertiesComponent*

Here is the link of the commit:
https://github.com/apache/camel/commit/83f4b0f485521967d05de4e65025c4558a75ff3c

Thanks.
Bye



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to