From 8a6a6d2a680e7587ac41bfc315fe1719af1b3975 Mon Sep 17 00:00:00 2001 From: Jonas Partner Date: Mon, 1 Mar 2010 21:15:46 +0000 Subject: [PATCH] fix for poll where no rows available --- .../jdbc/JdbcPollingChannelAdapter.java | 20 +- ...cPollingChannelAdapterIntegrationTest.java | 260 ++++++++++-------- 2 files changed, 154 insertions(+), 126 deletions(-) diff --git a/org.springframework.integration.jdbc/src/main/java/org/springframework/integration/jdbc/JdbcPollingChannelAdapter.java b/org.springframework.integration.jdbc/src/main/java/org/springframework/integration/jdbc/JdbcPollingChannelAdapter.java index cef13541fd..58f4c2e570 100644 --- a/org.springframework.integration.jdbc/src/main/java/org/springframework/integration/jdbc/JdbcPollingChannelAdapter.java +++ b/org.springframework.integration.jdbc/src/main/java/org/springframework/integration/jdbc/JdbcPollingChannelAdapter.java @@ -62,7 +62,7 @@ public class JdbcPollingChannelAdapter implements MessageSource, private volatile boolean updatePerRow = false; - private volatile String updateQuery; + private volatile String updateSql; private volatile SqlParamterSourceFactory sqlParameterSourceFactoryForUpdate = new DefaultSqlParamterSourceFactory(); @@ -91,8 +91,8 @@ public class JdbcPollingChannelAdapter implements MessageSource, this.rowMapper = rowMapper; } - public void setUpdateQuery(String updateQuery) { - this.updateQuery = updateQuery; + public void setUpdatesql(String updateSql) { + this.updateSql = updateSql; } public void setUpdatePerRow(boolean updatePerRow){ @@ -127,6 +127,9 @@ public class JdbcPollingChannelAdapter implements MessageSource, } else { payload = pollAndUpdate(); } + if(payload == null){ + return null; + } return MessageBuilder.withPayload(payload).build(); } @@ -138,7 +141,12 @@ public class JdbcPollingChannelAdapter implements MessageSource, payload = this.jdbcOperations.queryForList(this.selectQuery, this.sqlQueryParameterSource); } - if (updateQuery != null) { + + if(payload.size() < 1){ + payload = null; + } + + if (payload != null && updateSql != null) { if (this.updatePerRow) { for (Object row : payload) { executeUpdateQuery(row); @@ -157,9 +165,9 @@ public class JdbcPollingChannelAdapter implements MessageSource, updateParamaterSource = this.sqlParameterSourceFactoryForUpdate .createParamterSource(obj); - this.jdbcOperations.update(this.updateQuery, updateParamaterSource); + this.jdbcOperations.update(this.updateSql, updateParamaterSource); } else { - this.jdbcOperations.update(this.updateQuery); + this.jdbcOperations.update(this.updateSql); } } diff --git a/org.springframework.integration.jdbc/src/test/java/org/springframework/integration/jdbc/JdbcPollingChannelAdapterIntegrationTest.java b/org.springframework.integration.jdbc/src/test/java/org/springframework/integration/jdbc/JdbcPollingChannelAdapterIntegrationTest.java index 23a4c776e5..4fc7145499 100644 --- a/org.springframework.integration.jdbc/src/test/java/org/springframework/integration/jdbc/JdbcPollingChannelAdapterIntegrationTest.java +++ b/org.springframework.integration.jdbc/src/test/java/org/springframework/integration/jdbc/JdbcPollingChannelAdapterIntegrationTest.java @@ -1,7 +1,6 @@ package org.springframework.integration.jdbc; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import java.sql.ResultSet; import java.sql.SQLException; @@ -23,119 +22,145 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; */ public class JdbcPollingChannelAdapterIntegrationTest { - EmbeddedDatabase embeddedDatabase; + EmbeddedDatabase embeddedDatabase; - SimpleJdbcTemplate jdbcTemplate; + SimpleJdbcTemplate jdbcTemplate; - @Before - public void setUp(){ - EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); - builder.setType(EmbeddedDatabaseType.DERBY).addScript("classpath:org/springframework/integration/jdbc/pollingChannelAdapterIntegrationTest.sql"); - this.embeddedDatabase = builder.build(); - this.jdbcTemplate = new SimpleJdbcTemplate(this.embeddedDatabase); - } + @Before + public void setUp() { + EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); + builder + .setType(EmbeddedDatabaseType.DERBY) + .addScript( + "classpath:org/springframework/integration/jdbc/pollingChannelAdapterIntegrationTest.sql"); + this.embeddedDatabase = builder.build(); + this.jdbcTemplate = new SimpleJdbcTemplate(this.embeddedDatabase); + } - - @After - public void tearDown(){ - this.embeddedDatabase.shutdown(); - } + @After + public void tearDown() { + this.embeddedDatabase.shutdown(); + } - @Test - public void testSimplePollForListOfMapsNoUpdate(){ - JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter(this.embeddedDatabase, "select * from item"); - this.jdbcTemplate.update("insert into item values(1,2)") ; - Message message = adapter.receive(); - Object payload = message.getPayload(); - assertTrue("Wrong payload type", payload instanceof List); - List rows = (List)payload; - assertEquals("Wrong number of elements" , 1, rows.size()); - assertTrue("Returned row not a map", rows.get(0) instanceof Map); - Map row = (Map)rows.get(0); - assertEquals("Wrong id", 1, row.get("id")); - assertEquals("Wrong status", 2, row.get("status")); - - } - - - @Test - public void testSimplePollForListWithRowMapperNoUpdate(){ - JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter(this.embeddedDatabase, "select * from item"); - adapter.setRowMapper(new ItemRowMapper()); - this.jdbcTemplate.update("insert into item values(1,2)") ; - Message message = adapter.receive(); - Object payload = message.getPayload(); - List rows = (List)payload; - assertEquals("Wrong number of elements" , 1, rows.size()); - assertTrue("Wrong payload type", rows.get(0) instanceof Item); - Item item = (Item)rows.get(0); - assertEquals("Wrong id", 1, item.getId()); - assertEquals("Wrong status", 2, item.getStatus()); - - } - + @Test + public void testSimplePollForListOfMapsNoUpdate() { + JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter( + this.embeddedDatabase, "select * from item"); + this.jdbcTemplate.update("insert into item values(1,2)"); + Message message = adapter.receive(); + Object payload = message.getPayload(); + assertTrue("Wrong payload type", payload instanceof List); + List rows = (List) payload; + assertEquals("Wrong number of elements", 1, rows.size()); + assertTrue("Returned row not a map", rows.get(0) instanceof Map); + Map row = (Map) rows.get(0); + assertEquals("Wrong id", 1, row.get("id")); + assertEquals("Wrong status", 2, row.get("status")); - @Test - public void testSimplePollForListWithRowMapperAndOneUpdate(){ - JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter(this.embeddedDatabase, "select * from item where status=2"); - adapter.setUpdateQuery("update item set status = 10 where id in (:idList)"); - adapter.setRowMapper(new ItemRowMapper()); - - this.jdbcTemplate.update("insert into item values(1,2)") ; - this.jdbcTemplate.update("insert into item values(2,2)") ; - - Message message = adapter.receive(); - Object payload = message.getPayload(); - List rows = (List)payload; - assertEquals("Wrong number of elements" , 2, rows.size()); - assertTrue("Wrong payload type", rows.get(0) instanceof Item); - Item item = (Item)rows.get(0); - assertEquals("Wrong id", 1, item.getId()); - assertEquals("Wrong status", 2, item.getStatus()); - - int countOfStatusTwo = this.jdbcTemplate.queryForInt("select count(*) from item where status = 2"); - assertEquals("Status not updated incorect number of rows with status 2", 0, countOfStatusTwo); - - int countOfStatusTen = this.jdbcTemplate.queryForInt("select count(*) from item where status = 10"); - assertEquals("Status not updated incorect number of rows with status 10", 2, countOfStatusTen); - - - } - - @Test - public void testSimplePollForListWithRowMapperAndUpdatePerRow(){ - JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter(this.embeddedDatabase, "select * from item where status=2"); - adapter.setUpdateQuery("update item set status = 10 where id = :id"); - adapter.setUpdatePerRow(true); - adapter.setRowMapper(new ItemRowMapper()); - - this.jdbcTemplate.update("insert into item values(1,2)") ; - this.jdbcTemplate.update("insert into item values(2,2)") ; - - Message message = adapter.receive(); - Object payload = message.getPayload(); - List rows = (List)payload; - assertEquals("Wrong number of elements" , 2, rows.size()); - assertTrue("Wrong payload type", rows.get(0) instanceof Item); - Item item = (Item)rows.get(0); - assertEquals("Wrong id", 1, item.getId()); - assertEquals("Wrong status", 2, item.getStatus()); - - int countOfStatusTwo = this.jdbcTemplate.queryForInt("select count(*) from item where status = 2"); - assertEquals("Status not updated incorect number of rows with status 2", 0, countOfStatusTwo); - - int countOfStatusTen = this.jdbcTemplate.queryForInt("select count(*) from item where status = 10"); - assertEquals("Status not updated incorect number of rows with status 10", 2, countOfStatusTen); - - - } - - private static class Item{ - - - private int id; - - private int status; + } + + + + @Test + public void testSimplePollForListWithRowMapperNoUpdate() { + JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter( + this.embeddedDatabase, "select * from item"); + adapter.setRowMapper(new ItemRowMapper()); + this.jdbcTemplate.update("insert into item values(1,2)"); + Message message = adapter.receive(); + Object payload = message.getPayload(); + List rows = (List) payload; + assertEquals("Wrong number of elements", 1, rows.size()); + assertTrue("Wrong payload type", rows.get(0) instanceof Item); + Item item = (Item) rows.get(0); + assertEquals("Wrong id", 1, item.getId()); + assertEquals("Wrong status", 2, item.getStatus()); + + } + + @Test + public void testSimplePollForListWithRowMapperAndOneUpdate() { + JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter( + this.embeddedDatabase, "select * from item where status=2"); + adapter + .setUpdatesql("update item set status = 10 where id in (:idList)"); + adapter.setRowMapper(new ItemRowMapper()); + + this.jdbcTemplate.update("insert into item values(1,2)"); + this.jdbcTemplate.update("insert into item values(2,2)"); + + Message message = adapter.receive(); + Object payload = message.getPayload(); + List rows = (List) payload; + assertEquals("Wrong number of elements", 2, rows.size()); + assertTrue("Wrong payload type", rows.get(0) instanceof Item); + Item item = (Item) rows.get(0); + assertEquals("Wrong id", 1, item.getId()); + assertEquals("Wrong status", 2, item.getStatus()); + + int countOfStatusTwo = this.jdbcTemplate + .queryForInt("select count(*) from item where status = 2"); + assertEquals( + "Status not updated incorect number of rows with status 2", 0, + countOfStatusTwo); + + int countOfStatusTen = this.jdbcTemplate + .queryForInt("select count(*) from item where status = 10"); + assertEquals( + "Status not updated incorect number of rows with status 10", 2, + countOfStatusTen); + + } + + @Test + public void testSimplePollForListWithRowMapperAndUpdatePerRow() { + JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter( + this.embeddedDatabase, "select * from item where status=2"); + adapter.setUpdatesql("update item set status = 10 where id = :id"); + adapter.setUpdatePerRow(true); + adapter.setRowMapper(new ItemRowMapper()); + + this.jdbcTemplate.update("insert into item values(1,2)"); + this.jdbcTemplate.update("insert into item values(2,2)"); + + Message message = adapter.receive(); + Object payload = message.getPayload(); + List rows = (List) payload; + assertEquals("Wrong number of elements", 2, rows.size()); + assertTrue("Wrong payload type", rows.get(0) instanceof Item); + Item item = (Item) rows.get(0); + assertEquals("Wrong id", 1, item.getId()); + assertEquals("Wrong status", 2, item.getStatus()); + + int countOfStatusTwo = this.jdbcTemplate + .queryForInt("select count(*) from item where status = 2"); + assertEquals( + "Status not updated incorect number of rows with status 2", 0, + countOfStatusTwo); + + int countOfStatusTen = this.jdbcTemplate + .queryForInt("select count(*) from item where status = 10"); + assertEquals( + "Status not updated incorect number of rows with status 10", 2, + countOfStatusTen); + + } + + @Test + public void testEmptyPoll() { + JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter( + this.embeddedDatabase, "select * from item"); + Message message = adapter.receive(); + assertNull("Message received when no rows in table", message); + + + } + + private static class Item { + + private int id; + + private int status; public int getId() { return id; @@ -152,22 +177,17 @@ public class JdbcPollingChannelAdapterIntegrationTest { public void setStatus(int status) { this.status = status; } - } - - private static class ItemRowMapper implements RowMapper{ + } + + private static class ItemRowMapper implements RowMapper { - public Item mapRow(ResultSet rs, int rowNum) throws SQLException { Item item = new Item(); item.setId(rs.getInt(1)); item.setStatus(rs.getInt(2)); return item; } - - - - - - } + + } } \ No newline at end of file