Author: davsclaus Date: Mon Jan 2 08:01:57 2012 New Revision: 1226364 URL: http://svn.apache.org/viewvc?rev=1226364&view=rev Log: CAMEL-4844: Expressions in Camel routes is now also resolving property placeholders on route creation.
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentSetHeaderSimpleTest.java - copied, changed from r1226049, camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentSimpleLanguageTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java camel/trunk/camel-core/src/test/resources/org/apache/camel/component/properties/cheese.properties camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/GroovySetHeaderPropertyComponentTest.java camel/trunk/components/camel-script/src/test/resources/org/apache/camel/builder/script/myproperties.properties Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java?rev=1226364&r1=1226363&r2=1226364&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java Mon Jan 2 08:01:57 2012 @@ -418,14 +418,28 @@ public abstract class ProcessorDefinitio protected Processor makeProcessor(RouteContext routeContext) throws Exception { Processor processor = null; + // allow any custom logic before we create the processor + preCreateProcessor(); + // resolve properties before we create the processor resolvePropertyPlaceholders(routeContext, this); // resolve constant fields (eg Exchange.FILE_NAME) resolveKnownConstantFields(this); - // allow any custom logic before we create the processor - preCreateProcessor(); + // also resolve properties and constant fields on embedded expressions + ProcessorDefinition me = (ProcessorDefinition) this; + if (me instanceof ExpressionNode) { + ExpressionNode exp = (ExpressionNode) me; + ExpressionDefinition expressionDefinition = exp.getExpression(); + if (expressionDefinition != null) { + // resolve properties before we create the processor + resolvePropertyPlaceholders(routeContext, expressionDefinition); + + // resolve constant fields (eg Exchange.FILE_NAME) + resolveKnownConstantFields(expressionDefinition); + } + } // at first use custom factory if (routeContext.getCamelContext().getProcessorFactory() != null) { @@ -444,32 +458,36 @@ public abstract class ProcessorDefinitio } /** - * Inspects the given processor definition and resolves any property placeholders from its properties. + * Inspects the given definition and resolves any property placeholders from its properties. * <p/> * This implementation will check all the getter/setter pairs on this instance and for all the values * (which is a String type) will be property placeholder resolved. * * @param routeContext the route context - * @param definition the processor definition + * @param definition the definition * @throws Exception is thrown if property placeholders was used and there was an error resolving them * @see org.apache.camel.CamelContext#resolvePropertyPlaceholders(String) * @see org.apache.camel.component.properties.PropertiesComponent */ - protected void resolvePropertyPlaceholders(RouteContext routeContext, ProcessorDefinition definition) throws Exception { + protected void resolvePropertyPlaceholders(RouteContext routeContext, Object definition) throws Exception { log.trace("Resolving property placeholders for: {}", definition); // find all getter/setter which we can use for property placeholders Map<Object, Object> properties = new HashMap<Object, Object>(); IntrospectionSupport.getProperties(definition, properties, null); + ProcessorDefinition processorDefinition = null; + if (definition instanceof ProcessorDefinition) { + processorDefinition = (ProcessorDefinition) definition; + } // include additional properties which have the Camel placeholder QName // and when the definition parameter is this (otherAttributes belong to this) - if (definition.getOtherAttributes() != null) { - for (Object key : definition.getOtherAttributes().keySet()) { + if (processorDefinition != null && processorDefinition.getOtherAttributes() != null) { + for (Object key : processorDefinition.getOtherAttributes().keySet()) { QName qname = (QName) key; if (Constants.PLACEHOLDER_QNAME.equals(qname.getNamespaceURI())) { String local = qname.getLocalPart(); - Object value = definition.getOtherAttributes().get(key); + Object value = processorDefinition.getOtherAttributes().get(key); if (value != null && value instanceof String) { // value must be enclosed with placeholder tokens String s = (String) value; @@ -519,14 +537,14 @@ public abstract class ProcessorDefinitio } /** - * Inspects the given processor definition and resolves known fields + * Inspects the given definition and resolves known fields * <p/> * This implementation will check all the getter/setter pairs on this instance and for all the values * (which is a String type) will check if it refers to a known field (such as on Exchange). * - * @param definition the processor definition + * @param definition the definition */ - protected void resolveKnownConstantFields(ProcessorDefinition definition) throws Exception { + protected void resolveKnownConstantFields(Object definition) throws Exception { log.trace("Resolving known fields for: {}", definition); // find all String getter/setter Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentSetHeaderSimpleTest.java (from r1226049, camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentSimpleLanguageTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentSetHeaderSimpleTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentSetHeaderSimpleTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentSimpleLanguageTest.java&r1=1226049&r2=1226364&rev=1226364&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentSimpleLanguageTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentSetHeaderSimpleTest.java Mon Jan 2 08:01:57 2012 @@ -17,113 +17,20 @@ package org.apache.camel.component.properties; import org.apache.camel.CamelContext; -import org.apache.camel.CamelExecutionException; import org.apache.camel.ContextTestSupport; -import org.apache.camel.RuntimeCamelException; import org.apache.camel.builder.RouteBuilder; /** * @version */ -public class PropertiesComponentSimpleLanguageTest extends ContextTestSupport { +public class PropertiesComponentSetHeaderSimpleTest extends ContextTestSupport { + + public void testPropertiesAndSimple() throws Exception { + getMockEndpoint("mock:result").expectedHeaderReceived("foo", "http://mycoolserver/myapp"); - @Override - public boolean isUseRouteBuilder() { - return false; - } - - public void testPropertiesComponentSimpleLanguage() throws Exception { - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("direct:start") - .transform().simple("Hi ${body} do you think ${properties:cheese.quote}?"); - } - }); - context.start(); - - String reply = template.requestBody("direct:start", "Claus", String.class); - assertEquals("Hi Claus do you think Camel rocks?", reply); - } - - public void testPropertiesComponentDualSimpleLanguage() throws Exception { - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("direct:start") - .transform().simple("Hi ${body} do you think ${properties:cheese.quote}? And do you like ${properties:cheese.type} cheese?"); - } - }); - context.start(); - - String reply = template.requestBody("direct:start", "Claus", String.class); - assertEquals("Hi Claus do you think Camel rocks? And do you like Gouda cheese?", reply); - } - - public void testPropertiesComponentSimpleLanguageWithLocations() throws Exception { - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("direct:start") - .transform().simple("Hi ${body}. ${properties:org/apache/camel/component/properties/bar.properties:bar.quote}."); - } - }); - context.start(); - - String reply = template.requestBody("direct:start", "Claus", String.class); - assertEquals("Hi Claus. Beer taste good.", reply); - } - - public void testNoExistingPropertiesComponentWithLocation() throws Exception { - context.removeComponent("properties"); - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("direct:start") - .transform().simple("Hi ${body}. ${properties:org/apache/camel/component/properties/bar.properties:bar.quote}."); - } - }); - context.start(); - - String reply = template.requestBody("direct:start", "Claus", String.class); - assertEquals("Hi Claus. Beer taste good.", reply); - } - - public void testNoExistingPropertiesComponentWithLocations() throws Exception { - context.removeComponent("properties"); - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("direct:start") - .transform().simple("Hi ${body}. ${properties:org/apache/camel/component/properties/bar.properties," - + "org/apache/camel/component/properties/cheese.properties:cheese.quote}."); - } - }); - context.start(); - - String reply = template.requestBody("direct:start", "Claus", String.class); - assertEquals("Hi Claus. Camel rocks.", reply); - } - - public void testNoExistingPropertiesComponentWithoutLocation() throws Exception { - context.removeComponent("properties"); - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("direct:start") - .transform().simple("Hi ${body} do you think ${properties:cheese.quote}?"); - } - }); - context.start(); + template.sendBodyAndHeader("direct:start", "Hello World", "app", "myapp"); - try { - template.requestBody("direct:start", "Claus", String.class); - fail("Should have thrown exception"); - } catch (CamelExecutionException e) { - RuntimeCamelException rce = assertIsInstanceOf(RuntimeCamelException.class, e.getCause()); - IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, rce.getCause()); - assertEquals("PropertiesComponent with name properties must be defined in CamelContext to support property placeholders in expressions", iae.getMessage()); - } + assertMockEndpointsSatisfied(); } @Override @@ -138,4 +45,15 @@ public class PropertiesComponentSimpleLa return context; } + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .setHeader("foo").simple("{{cheese.server}}/${header.app}") + .to("mock:result"); + } + }; + } } \ No newline at end of file Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java?rev=1226364&r1=1226363&r2=1226364&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java Mon Jan 2 08:01:57 2012 @@ -1016,6 +1016,11 @@ public class SimpleTest extends Language assertExpression("${body.getClass.getSimpleName}", "Animal"); assertExpression("${body.class.simpleName}", "Animal"); } + + public void testSlashBeforeHeader() throws Exception { + assertExpression("foo/${header.foo}", "foo/abc"); + assertExpression("foo\\${header.foo}", "foo\\abc"); + } protected String getLanguageName() { return "simple"; Modified: camel/trunk/camel-core/src/test/resources/org/apache/camel/component/properties/cheese.properties URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/resources/org/apache/camel/component/properties/cheese.properties?rev=1226364&r1=1226363&r2=1226364&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/resources/org/apache/camel/component/properties/cheese.properties (original) +++ camel/trunk/camel-core/src/test/resources/org/apache/camel/component/properties/cheese.properties Mon Jan 2 08:01:57 2012 @@ -18,6 +18,7 @@ cheese.end=mock:cheese cheese.quote=Camel rocks cheese.type=Gouda +cheese.server=http://mycoolserver bean.foo=foo bean.bar=bar \ No newline at end of file Modified: camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/GroovySetHeaderPropertyComponentTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/GroovySetHeaderPropertyComponentTest.java?rev=1226364&r1=1226363&r2=1226364&view=diff ============================================================================== --- camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/GroovySetHeaderPropertyComponentTest.java (original) +++ camel/trunk/components/camel-script/src/test/java/org/apache/camel/builder/script/GroovySetHeaderPropertyComponentTest.java Mon Jan 2 08:01:57 2012 @@ -45,6 +45,20 @@ public class GroovySetHeaderPropertyComp assertMockEndpointsSatisfied(); } + @Test + public void testNumber() throws Exception { + if (!ScriptTestHelper.canRunTestOnThisPlatform()) { + return; + } + + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived(5); + + template.sendBody("direct:number", 3); + + assertMockEndpointsSatisfied(); + } + protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { public void configure() throws Exception { @@ -54,6 +68,10 @@ public class GroovySetHeaderPropertyComp from("direct:start") .setHeader("myHeader").groovy("context.resolvePropertyPlaceholders('{{' + request.headers.get('foo') + '}}')") .to("mock:result"); + + from("direct:number") + .transform().groovy("{{myscript}}") + .to("mock:result"); } }; } Modified: camel/trunk/components/camel-script/src/test/resources/org/apache/camel/builder/script/myproperties.properties URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-script/src/test/resources/org/apache/camel/builder/script/myproperties.properties?rev=1226364&r1=1226363&r2=1226364&view=diff ============================================================================== --- camel/trunk/components/camel-script/src/test/resources/org/apache/camel/builder/script/myproperties.properties (original) +++ camel/trunk/components/camel-script/src/test/resources/org/apache/camel/builder/script/myproperties.properties Mon Jan 2 08:01:57 2012 @@ -16,4 +16,6 @@ ## --------------------------------------------------------------------------- foo=Camel -bar=Kong \ No newline at end of file +bar=Kong + +myscript=2 + request.body \ No newline at end of file