Author: romkal
Date: Thu Jan 22 07:39:01 2009
New Revision: 736676
URL: http://svn.apache.org/viewvc?rev=736676&view=rev
Log:
CAMEL-1283: Validation of correct number of parameters added
Null body allowed
Modified:
camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java
Modified:
camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java?rev=736676&r1=736675&r2=736676&view=diff
==============================================================================
---
camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
(original)
+++
camel/trunk/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
Thu Jan 22 07:39:01 2009
@@ -22,6 +22,7 @@
import java.util.List;
import org.apache.camel.Exchange;
+import org.apache.camel.NoTypeConversionAvailableException;
import org.apache.camel.impl.DefaultProducer;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ColumnMapRowMapper;
@@ -45,10 +46,20 @@
public Object doInPreparedStatement(PreparedStatement ps) throws
SQLException,
DataAccessException {
int argNumber = 1;
- for (Iterator<?> i = exchange.getIn().getBody(Iterator.class);
i.hasNext();) {
- ps.setObject(argNumber++, i.next());
+ try {
+ Iterator<?> iterator =
exchange.getIn().getBody(Iterator.class);
+ while (iterator != null && iterator.hasNext()) {
+ ps.setObject(argNumber++, iterator.next());
+ }
+ } catch (NoTypeConversionAvailableException e) {
+ // ignored - assumed no parameters have to be used
}
+ if (argNumber - 1 !=
ps.getParameterMetaData().getParameterCount()) {
+ throw new SQLException("To less parameters set");
+ }
+
boolean isResultSet = ps.execute();
+
if (isResultSet) {
RowMapperResultSetExtractor mapper = new
RowMapperResultSetExtractor(new ColumnMapRowMapper());
List<?> result = (List<?>)
mapper.extractData(ps.getResultSet());
Modified:
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java?rev=736676&r1=736675&r2=736676&view=diff
==============================================================================
---
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java
(original)
+++
camel/trunk/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java
Thu Jan 22 07:39:01 2009
@@ -23,9 +23,12 @@
import javax.sql.DataSource;
import org.apache.camel.ContextTestSupport;
+import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
+import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.UncategorizedSQLException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;
@@ -63,15 +66,26 @@
assertEquals(1, row.get("ID"));
}
- public void testBadNumberOfParameter() throws Exception {
- MockEndpoint mock = getMockEndpoint("mock:result");
- mock.expectedMessageCount(1);
- template.sendBody("direct:list", "ASF");
- mock.assertIsSatisfied();
- List received = assertIsInstanceOf(List.class,
mock.getReceivedExchanges().get(0).getIn().getBody());
- assertEquals(0, received.size());
+ public void testLowNumberOfParameter() throws Exception {
+ try {
+ template.sendBody("direct:list", "ASF");
+ fail();
+ } catch (RuntimeCamelException e) {
+ // should have DataAccessException thrown
+ assertTrue("Exception thrown is wrong", e.getCause() instanceof
DataAccessException);
+ }
}
+ public void testHighNumberOfParameter() throws Exception {
+ try {
+ template.sendBody("direct:simple", new Object[] {"ASF", "Foo"});
+ fail();
+ } catch (RuntimeCamelException e) {
+ // should have DataAccessException thrown
+ assertTrue("Exception thrown is wrong", e.getCause() instanceof
DataAccessException);
+ }
+ }
+
public void testListResult() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedMessageCount(1);
@@ -119,6 +133,16 @@
assertEquals((Integer)1, actualUpdateCount);
}
+ public void testNoBody() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedMessageCount(1);
+ template.sendBody("direct:no-param", null);
+ mock.assertIsSatisfied();
+ List received = assertIsInstanceOf(List.class,
mock.getReceivedExchanges().get(0).getIn().getBody());
+ Map row = assertIsInstanceOf(Map.class, received.get(0));
+ assertEquals("Camel", row.get("PROJECT"));
+ }
+
protected void setUp() throws Exception {
Class.forName(driverClass);
super.setUp();
@@ -145,6 +169,8 @@
getContext().getComponent("sql",
SqlComponent.class).setDataSource(ds);
+ errorHandler(noErrorHandler());
+
from("direct:simple").to("sql:select * from projects where
license = # order by id")
.to("mock:result");
@@ -157,6 +183,8 @@
.to("mock:result");
from("direct:insert").to("sql:insert into projects values (#,
#, #)").to("mock:result");
+
+ from("direct:no-param").to("sql:select * from projects order
by id").to("mock:result");
}
};
}