You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2015/12/15 18:32:12 UTC

[1/2] camel git commit: CAMEL-9212: Enable dynamic values in the headerName / propertyName.

Repository: camel
Updated Branches:
  refs/heads/master 823402193 -> 5d77c1162


CAMEL-9212: Enable dynamic values in the headerName / propertyName.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/140be42e
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/140be42e
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/140be42e

Branch: refs/heads/master
Commit: 140be42e8ebee44403eac81b1881eab17cbb6b5f
Parents: 8234021
Author: Sami Nurminen <sn...@gmail.com>
Authored: Sat Nov 28 13:52:04 2015 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Dec 15 17:30:18 2015 +0100

----------------------------------------------------------------------
 .../apache/camel/builder/ExpressionBuilder.java | 13 ++++++
 .../apache/camel/model/SetHeaderDefinition.java | 16 ++++---
 .../camel/model/SetPropertyDefinition.java      |  4 +-
 .../camel/processor/SetHeaderProcessor.java     | 16 +++++--
 .../camel/processor/SetPropertyProcessor.java   | 17 +++++--
 .../SpringSetHeaderNameDynamicTest.java         | 46 +++++++++++++++++++
 .../SpringSetPropertyNameDynamicTest.java       | 48 ++++++++++++++++++++
 .../spring/processor/setHeaderNameDynamic.xml   | 36 +++++++++++++++
 .../spring/processor/setPropertyNameDynamic.xml | 36 +++++++++++++++
 9 files changed, 214 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/140be42e/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
index 8563a14..eef4976 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
@@ -57,6 +57,8 @@ import org.apache.camel.util.GroupIterator;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.OgnlHelper;
+import org.apache.camel.util.StringHelper;
+
 
 /**
  * A helper class for working with <a href="http://camel.apache.org/expression.html">expressions</a>.
@@ -1876,6 +1878,17 @@ public final class ExpressionBuilder {
         };
     }
 
+    /**
+     * Returns Simple expression or fallbacks to Constant expression
+     * if expression str is not Simple expression.
+     */
+    public static Expression parseSimpleOrFallbackToConstantExpression(String str, CamelContext camelContext) {
+        if (StringHelper.hasStartToken(str, "simple")) {
+            return camelContext.resolveLanguage("simple").createExpression(str);
+        }
+        return constantExpression(str);
+    }
+
     public static Expression propertiesComponentExpression(final String key, final String locations) {
         return new ExpressionAdapter() {
             public Object evaluate(Exchange exchange) {

http://git-wip-us.apache.org/repos/asf/camel/blob/140be42e/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java b/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
index 6d1f794e..2d51f3a 100644
--- a/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
@@ -39,7 +39,7 @@ import org.apache.camel.util.ObjectHelper;
 public class SetHeaderDefinition extends NoOutputExpressionNode {
     @XmlAttribute(required = true)
     private String headerName;
-    
+
     public SetHeaderDefinition() {
     }
 
@@ -50,14 +50,14 @@ public class SetHeaderDefinition extends NoOutputExpressionNode {
 
     public SetHeaderDefinition(String headerName, Expression expression) {
         super(expression);
-        setHeaderName(headerName);        
+        setHeaderName(headerName);
     }
 
     public SetHeaderDefinition(String headerName, String value) {
         super(ExpressionBuilder.constantExpression(value));
-        setHeaderName(headerName);        
-    }   
-    
+        setHeaderName(headerName);
+    }
+
     @Override
     public String toString() {
         return "SetHeader[" + getHeaderName() + ", " + getExpression() + "]";
@@ -72,7 +72,9 @@ public class SetHeaderDefinition extends NoOutputExpressionNode {
     public Processor createProcessor(RouteContext routeContext) throws Exception {
         ObjectHelper.notNull(headerName, "headerName");
         Expression expr = getExpression().createExpression(routeContext);
-        return new SetHeaderProcessor(getHeaderName(), expr);
+        Expression nameExpr = ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(getHeaderName(),
+                routeContext.getCamelContext());
+        return new SetHeaderProcessor(nameExpr, expr);
     }
 
     /**
@@ -94,5 +96,5 @@ public class SetHeaderDefinition extends NoOutputExpressionNode {
     public String getHeaderName() {
         return headerName;
     }
-    
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/140be42e/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java b/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
index a0c1376..a4e1f5d 100644
--- a/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
@@ -72,7 +72,9 @@ public class SetPropertyDefinition extends NoOutputExpressionNode {
     public Processor createProcessor(RouteContext routeContext) throws Exception {
         ObjectHelper.notNull(getPropertyName(), "propertyName", this);
         Expression expr = getExpression().createExpression(routeContext);
-        return new SetPropertyProcessor(getPropertyName(), expr);
+        Expression nameExpr = ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(getPropertyName(),
+                routeContext.getCamelContext());
+        return new SetPropertyProcessor(nameExpr, expr);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/camel/blob/140be42e/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java
index 7604af8..74a6733 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java
@@ -18,6 +18,8 @@ package org.apache.camel.processor;
 
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.AsyncProcessor;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.Message;
@@ -31,10 +33,10 @@ import org.apache.camel.util.AsyncProcessorHelper;
  */
 public class SetHeaderProcessor extends ServiceSupport implements AsyncProcessor, Traceable, IdAware {
     private String id;
-    private final String headerName;
+    private final Expression headerName;
     private final Expression expression;
 
-    public SetHeaderProcessor(String headerName, Expression expression) {
+    public SetHeaderProcessor(Expression headerName, Expression expression) {
         this.headerName = headerName;
         this.expression = expression;
     }
@@ -57,7 +59,7 @@ public class SetHeaderProcessor extends ServiceSupport implements AsyncProcessor
             boolean out = exchange.hasOut();
             Message old = out ? exchange.getOut() : exchange.getIn();
 
-            old.setHeader(headerName, newHeader);
+            old.setHeader(resolveHeaderNameByExchange(exchange), newHeader);
 
         } catch (Throwable e) {
             exchange.setException(e);
@@ -67,6 +69,10 @@ public class SetHeaderProcessor extends ServiceSupport implements AsyncProcessor
         return true;
     }
 
+    private String resolveHeaderNameByExchange(Exchange exchange) {
+        return this.headerName.evaluate(exchange, String.class);
+    }
+
     @Override
     public String toString() {
         return "SetHeader(" + headerName + ", " + expression + ")";
@@ -85,7 +91,7 @@ public class SetHeaderProcessor extends ServiceSupport implements AsyncProcessor
     }
 
     public String getHeaderName() {
-        return headerName;
+        return headerName.toString();
     }
 
     public Expression getExpression() {
@@ -94,7 +100,7 @@ public class SetHeaderProcessor extends ServiceSupport implements AsyncProcessor
 
     @Override
     protected void doStart() throws Exception {
-        // noop
+        //noop
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/140be42e/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java
index 70d1a60..59fc478 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java
@@ -18,6 +18,8 @@ package org.apache.camel.processor;
 
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.AsyncProcessor;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.Traceable;
@@ -30,10 +32,10 @@ import org.apache.camel.util.AsyncProcessorHelper;
  */
 public class SetPropertyProcessor extends ServiceSupport implements AsyncProcessor, Traceable, IdAware {
     private String id;
-    private final String propertyName;
+    private final Expression propertyName;
     private final Expression expression;
 
-    public SetPropertyProcessor(String propertyName, Expression expression) {
+    public SetPropertyProcessor(Expression propertyName, Expression expression) {
         this.propertyName = propertyName;
         this.expression = expression;
     }
@@ -53,7 +55,7 @@ public class SetPropertyProcessor extends ServiceSupport implements AsyncProcess
                 return true;
             }
 
-            exchange.setProperty(propertyName, newProperty);
+            exchange.setProperty(resolvePropertyNameByExchange(exchange), newProperty);
         } catch (Throwable e) {
             exchange.setException(e);
         }
@@ -62,6 +64,10 @@ public class SetPropertyProcessor extends ServiceSupport implements AsyncProcess
         return true;
     }
 
+    private String resolvePropertyNameByExchange(Exchange exchange) {
+        return this.propertyName.evaluate(exchange, String.class);
+    }
+
     @Override
     public String toString() {
         return "SetProperty(" + propertyName + ", " + expression + ")";
@@ -80,16 +86,17 @@ public class SetPropertyProcessor extends ServiceSupport implements AsyncProcess
     }
 
     public String getPropertyName() {
-        return propertyName;
+        return propertyName.toString();
     }
 
     public Expression getExpression() {
         return expression;
     }
 
+
     @Override
     protected void doStart() throws Exception {
-        // noop
+        //noop
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/140be42e/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetHeaderNameDynamicTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetHeaderNameDynamicTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetHeaderNameDynamicTest.java
new file mode 100644
index 0000000..8fd38eb
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetHeaderNameDynamicTest.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spring.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.mock.MockEndpoint;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringSetHeaderNameDynamicTest extends ContextTestSupport {
+
+
+    public void testSetHeaderNameWithExpression() throws Exception {
+        MockEndpoint resultEndpoint = getMockEndpoint("mock:end");
+        resultEndpoint.expectedMessageCount(1);
+
+        sendBody("direct:start", "Hello");
+
+        resultEndpoint.assertIsSatisfied();
+
+        Exchange exchange = resultEndpoint.getExchanges().get(0);
+
+        assertEquals(Boolean.TRUE, exchange.getIn().getHeader(SpringSetPropertyNameDynamicTest.TestConstans
+                .EXCHANGE_PROP_TX_FAILED, Boolean.class));
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/setHeaderNameDynamic.xml");
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/140be42e/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetPropertyNameDynamicTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetPropertyNameDynamicTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetPropertyNameDynamicTest.java
new file mode 100644
index 0000000..39997b3
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetPropertyNameDynamicTest.java
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spring.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.mock.MockEndpoint;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringSetPropertyNameDynamicTest extends ContextTestSupport {
+
+    public static class TestConstans {
+        public static final String EXCHANGE_PROP_TX_FAILED = "ExchangePropTxFailed";
+    }
+
+    public void testSetPropertyNameWithExpression() throws Exception {
+        MockEndpoint resultEndpoint = getMockEndpoint("mock:end");
+        resultEndpoint.expectedMessageCount(1);
+
+        sendBody("direct:start", "Hello");
+
+        resultEndpoint.assertIsSatisfied();
+
+        Exchange exchange = resultEndpoint.getExchanges().get(0);
+
+        assertEquals(Boolean.TRUE, exchange.getProperty(TestConstans.EXCHANGE_PROP_TX_FAILED, Boolean.class));
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/setPropertyNameDynamic.xml");
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/140be42e/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/setHeaderNameDynamic.xml
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/setHeaderNameDynamic.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/setHeaderNameDynamic.xml
new file mode 100644
index 0000000..9db7025
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/setHeaderNameDynamic.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+
+  <!-- START SNIPPET: example -->
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <setHeader headerName="$simple{type:org.apache.camel.spring.processor.SpringSetPropertyNameDynamicTest$TestConstans.EXCHANGE_PROP_TX_FAILED}">
+        <simple>${type:java.lang.Boolean.TRUE}</simple>
+      </setHeader>
+      <to uri="mock:end"/>     
+    </route>
+  </camelContext>
+  <!-- END SNIPPET: example -->
+</beans>

http://git-wip-us.apache.org/repos/asf/camel/blob/140be42e/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/setPropertyNameDynamic.xml
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/setPropertyNameDynamic.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/setPropertyNameDynamic.xml
new file mode 100644
index 0000000..dd35529
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/setPropertyNameDynamic.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+
+  <!-- START SNIPPET: example -->
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <setProperty propertyName="$simple{type:org.apache.camel.spring.processor.SpringSetPropertyNameDynamicTest$TestConstans.EXCHANGE_PROP_TX_FAILED}">
+        <simple>${type:java.lang.Boolean.TRUE}</simple>
+      </setProperty>
+      <to uri="mock:end"/>     
+    </route>
+  </camelContext>
+  <!-- END SNIPPET: example -->
+</beans>


[2/2] camel git commit: Polished. Fixes #701

Posted by da...@apache.org.
Polished. Fixes #701


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/5d77c116
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/5d77c116
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/5d77c116

Branch: refs/heads/master
Commit: 5d77c1162c56f6db05e8f3244d907a8cbe35f366
Parents: 140be42
Author: Claus Ibsen <da...@apache.org>
Authored: Tue Dec 15 17:48:57 2015 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Dec 15 17:48:57 2015 +0100

----------------------------------------------------------------------
 .../org/apache/camel/builder/ExpressionBuilder.java  |  3 +--
 .../org/apache/camel/model/SetHeaderDefinition.java  |  6 ++++--
 .../apache/camel/model/SetPropertyDefinition.java    |  8 +++++---
 .../apache/camel/processor/SetHeaderProcessor.java   | 12 +++++-------
 .../apache/camel/processor/SetPropertyProcessor.java | 15 ++++++---------
 .../apache/camel/builder/ExpressionBuilderTest.java  |  6 ++++++
 6 files changed, 27 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/5d77c116/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
index eef4976..790ca36 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
@@ -1879,8 +1879,7 @@ public final class ExpressionBuilder {
     }
 
     /**
-     * Returns Simple expression or fallbacks to Constant expression
-     * if expression str is not Simple expression.
+     * Returns Simple expression or fallback to Constant expression if expression str is not Simple expression.
      */
     public static Expression parseSimpleOrFallbackToConstantExpression(String str, CamelContext camelContext) {
         if (StringHelper.hasStartToken(str, "simple")) {

http://git-wip-us.apache.org/repos/asf/camel/blob/5d77c116/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java b/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
index 2d51f3a..19b8a73 100644
--- a/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
@@ -72,8 +72,7 @@ public class SetHeaderDefinition extends NoOutputExpressionNode {
     public Processor createProcessor(RouteContext routeContext) throws Exception {
         ObjectHelper.notNull(headerName, "headerName");
         Expression expr = getExpression().createExpression(routeContext);
-        Expression nameExpr = ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(getHeaderName(),
-                routeContext.getCamelContext());
+        Expression nameExpr = ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(getHeaderName(), routeContext.getCamelContext());
         return new SetHeaderProcessor(nameExpr, expr);
     }
 
@@ -88,6 +87,9 @@ public class SetHeaderDefinition extends NoOutputExpressionNode {
 
     /**
      * Name of message header to set a new value
+     * <p/>
+     * The <tt>simple</tt> language can be used to define a dynamic evaluated header name to be used.
+     * Otherwise a constant name will be used.
      */
     public void setHeaderName(String headerName) {
         this.headerName = headerName;

http://git-wip-us.apache.org/repos/asf/camel/blob/5d77c116/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java b/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
index a4e1f5d..fdb0946 100644
--- a/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
@@ -72,8 +72,7 @@ public class SetPropertyDefinition extends NoOutputExpressionNode {
     public Processor createProcessor(RouteContext routeContext) throws Exception {
         ObjectHelper.notNull(getPropertyName(), "propertyName", this);
         Expression expr = getExpression().createExpression(routeContext);
-        Expression nameExpr = ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(getPropertyName(),
-                routeContext.getCamelContext());
+        Expression nameExpr = ExpressionBuilder.parseSimpleOrFallbackToConstantExpression(getPropertyName(), routeContext.getCamelContext());
         return new SetPropertyProcessor(nameExpr, expr);
     }
 
@@ -87,7 +86,10 @@ public class SetPropertyDefinition extends NoOutputExpressionNode {
     }
 
     /**
-     * Name of exchange property to set a new value
+     * Name of exchange property to set a new value.
+     * <p/>
+     * The <tt>simple</tt> language can be used to define a dynamic evaluated exchange property name to be used.
+     * Otherwise a constant name will be used.
      */
     public void setPropertyName(String propertyName) {
         this.propertyName = propertyName;

http://git-wip-us.apache.org/repos/asf/camel/blob/5d77c116/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java
index 74a6733..8153453 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/SetHeaderProcessor.java
@@ -18,8 +18,6 @@ package org.apache.camel.processor;
 
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.AsyncProcessor;
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.Message;
@@ -27,6 +25,7 @@ import org.apache.camel.Traceable;
 import org.apache.camel.spi.IdAware;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.AsyncProcessorHelper;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * A processor which sets the header on the IN or OUT message with an {@link org.apache.camel.Expression}
@@ -39,6 +38,8 @@ public class SetHeaderProcessor extends ServiceSupport implements AsyncProcessor
     public SetHeaderProcessor(Expression headerName, Expression expression) {
         this.headerName = headerName;
         this.expression = expression;
+        ObjectHelper.notNull(headerName, "headerName");
+        ObjectHelper.notNull(expression, "expression");
     }
 
     public void process(Exchange exchange) throws Exception {
@@ -59,7 +60,8 @@ public class SetHeaderProcessor extends ServiceSupport implements AsyncProcessor
             boolean out = exchange.hasOut();
             Message old = out ? exchange.getOut() : exchange.getIn();
 
-            old.setHeader(resolveHeaderNameByExchange(exchange), newHeader);
+            String key = headerName.evaluate(exchange, String.class);
+            old.setHeader(key, newHeader);
 
         } catch (Throwable e) {
             exchange.setException(e);
@@ -69,10 +71,6 @@ public class SetHeaderProcessor extends ServiceSupport implements AsyncProcessor
         return true;
     }
 
-    private String resolveHeaderNameByExchange(Exchange exchange) {
-        return this.headerName.evaluate(exchange, String.class);
-    }
-
     @Override
     public String toString() {
         return "SetHeader(" + headerName + ", " + expression + ")";

http://git-wip-us.apache.org/repos/asf/camel/blob/5d77c116/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java
index 59fc478..d310743 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/SetPropertyProcessor.java
@@ -18,14 +18,13 @@ package org.apache.camel.processor;
 
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.AsyncProcessor;
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.Traceable;
 import org.apache.camel.spi.IdAware;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.AsyncProcessorHelper;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * A processor which sets the property on the exchange with an {@link org.apache.camel.Expression}
@@ -38,6 +37,8 @@ public class SetPropertyProcessor extends ServiceSupport implements AsyncProcess
     public SetPropertyProcessor(Expression propertyName, Expression expression) {
         this.propertyName = propertyName;
         this.expression = expression;
+        ObjectHelper.notNull(propertyName, "propertyName");
+        ObjectHelper.notNull(expression, "expression");
     }
 
     public void process(Exchange exchange) throws Exception {
@@ -55,7 +56,8 @@ public class SetPropertyProcessor extends ServiceSupport implements AsyncProcess
                 return true;
             }
 
-            exchange.setProperty(resolvePropertyNameByExchange(exchange), newProperty);
+            String key = propertyName.evaluate(exchange, String.class);
+            exchange.setProperty(key, newProperty);
         } catch (Throwable e) {
             exchange.setException(e);
         }
@@ -64,10 +66,6 @@ public class SetPropertyProcessor extends ServiceSupport implements AsyncProcess
         return true;
     }
 
-    private String resolvePropertyNameByExchange(Exchange exchange) {
-        return this.propertyName.evaluate(exchange, String.class);
-    }
-
     @Override
     public String toString() {
         return "SetProperty(" + propertyName + ", " + expression + ")";
@@ -93,10 +91,9 @@ public class SetPropertyProcessor extends ServiceSupport implements AsyncProcess
         return expression;
     }
 
-
     @Override
     protected void doStart() throws Exception {
-        //noop
+        // noop
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/5d77c116/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java b/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
index da957ae..ac4a16e 100644
--- a/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
+++ b/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
@@ -104,6 +104,12 @@ public class ExpressionBuilderTest extends TestSupport {
         assertEquals("Get a wrong properties size", properties.size(), 1);
     }
 
+    public void testParseSimpleOrFallbackToConstantExpression() throws Exception {
+        assertEquals("world", parseSimpleOrFallbackToConstantExpression("world", camelContext).evaluate(exchange, String.class));
+        assertEquals("Hello there!", parseSimpleOrFallbackToConstantExpression("${body}", camelContext).evaluate(exchange, String.class));
+        assertEquals("Hello there!", parseSimpleOrFallbackToConstantExpression("$simple{body}", camelContext).evaluate(exchange, String.class));
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();