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() {