Author: davsclaus
Date: Thu Jan 17 11:28:59 2013
New Revision: 1434621

URL: http://svn.apache.org/viewvc?rev=1434621&view=rev
Log:
CAMEL-5977: camel-sql added support for named parameters.

Modified:
    
camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
    
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParameterTest.java
    
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParametersTest.java

Modified: 
camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java?rev=1434621&r1=1434620&r2=1434621&view=diff
==============================================================================
--- 
camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
 (original)
+++ 
camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
 Thu Jan 17 11:28:59 2013
@@ -54,9 +54,10 @@ public class DefaultSqlPrepareStatementS
                                               final Exchange exchange, final 
Object value) throws SQLException {
         if (hasNamedParameters(query)) {
             // create an iterator that returns the value in the named order
-            // the body must be a map type when using named parameters
             try {
-                final Map map = 
exchange.getContext().getTypeConverter().mandatoryConvertTo(Map.class, value);
+                // the body may be a map which we look at first
+                final Map bodyMap = 
exchange.getContext().getTypeConverter().tryConvertTo(Map.class, value);
+                final Map headerMap = exchange.getIn().hasHeaders() ? 
exchange.getIn().getHeaders() : null;
 
                 return new Iterator() {
                     private NamedQueryParser parser = new 
NamedQueryParser(query);
@@ -83,10 +84,16 @@ public class DefaultSqlPrepareStatementS
                                 return null;
                             }
                             // the key is expected to exist, if not report so 
end user can see this
-                            if (!map.containsKey(key)) {
-                                throw new RuntimeExchangeException("Cannot 
find key [" + key + "] in message body to use when setting named parameter in 
query [" + query + "]", exchange);
+                            boolean contains = bodyMap != null ? 
bodyMap.containsKey(key) : false;
+                            contains |= headerMap != null ? 
headerMap.containsKey(key) : false;
+                            if (!contains) {
+                                throw new RuntimeExchangeException("Cannot 
find key [" + key + "] in message body or headers to use when setting named 
parameter in query [" + query + "]", exchange);
+                            }
+                            // get from body before header
+                            next = bodyMap != null ? bodyMap.get(key) : null;
+                            if (next == null) {
+                                next = headerMap != null ? headerMap.get(key) 
: null;
                             }
-                            next = map.get(key);
                         }
                         Object answer = next;
                         next = null;

Modified: 
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParameterTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParameterTest.java?rev=1434621&r1=1434620&r2=1434621&view=diff
==============================================================================
--- 
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParameterTest.java
 (original)
+++ 
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParameterTest.java
 Thu Jan 17 11:28:59 2013
@@ -53,7 +53,7 @@ public class SqlProducerNamedParameterTe
     }
 
     @Test
-    public void testNamedParameter() throws Exception {
+    public void testNamedParameterFromBody() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedMessageCount(1);
 
@@ -73,6 +73,24 @@ public class SqlProducerNamedParameterTe
         assertEquals("AMQ", row.get("PROJECT"));
     }
 
+    @Test
+    public void testNamedParameterFromHeaders() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:start", "This is a dummy body", 
"lic", "ASF");
+
+        mock.assertIsSatisfied();
+
+        List<?> received = assertIsInstanceOf(List.class, 
mock.getReceivedExchanges().get(0).getIn().getBody());
+        assertEquals(2, received.size());
+        Map<?, ?> row = assertIsInstanceOf(Map.class, received.get(0));
+        assertEquals("Camel", row.get("PROJECT"));
+
+        row = assertIsInstanceOf(Map.class, received.get(1));
+        assertEquals("AMQ", row.get("PROJECT"));
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {

Modified: 
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParametersTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParametersTest.java?rev=1434621&r1=1434620&r2=1434621&view=diff
==============================================================================
--- 
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParametersTest.java
 (original)
+++ 
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerNamedParametersTest.java
 Thu Jan 17 11:28:59 2013
@@ -53,7 +53,7 @@ public class SqlProducerNamedParametersT
     }
 
     @Test
-    public void testNamedParameters() throws Exception {
+    public void testNamedParametersFromBody() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedMessageCount(1);
 
@@ -71,6 +71,25 @@ public class SqlProducerNamedParametersT
         assertEquals("AMQ", row.get("PROJECT"));
     }
 
+    @Test
+    public void testNamedParametersFromHeaders() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+
+        Map map = new HashMap();
+        map.put("lic", "ASF");
+        map.put("min", 1);
+
+        template.sendBodyAndHeaders("direct:start", "This is a dummy body", 
map);
+
+        mock.assertIsSatisfied();
+
+        List<?> received = assertIsInstanceOf(List.class, 
mock.getReceivedExchanges().get(0).getIn().getBody());
+        assertEquals(1, received.size());
+        Map<?, ?> row = assertIsInstanceOf(Map.class, received.get(0));
+        assertEquals("AMQ", row.get("PROJECT"));
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {


Reply via email to