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");
             }
         };
     }


Reply via email to