CAMEL-8130: sql component outputType=SelectList should support outputClass mapping also.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/92135be4 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/92135be4 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/92135be4 Branch: refs/heads/camel-2.14.x Commit: 92135be47514d2147230b403c2d597d5c47e772f Parents: 5c46d20 Author: Claus Ibsen <[email protected]> Authored: Mon Dec 8 14:28:31 2014 +0100 Committer: Claus Ibsen <[email protected]> Committed: Mon Dec 8 14:50:59 2014 +0100 ---------------------------------------------------------------------- .../apache/camel/component/sql/SqlConsumer.java | 2 +- .../apache/camel/component/sql/SqlEndpoint.java | 18 ++-- .../apache/camel/component/sql/SqlProducer.java | 4 +- ...nsumerOutputTypeSelectListWithClassTest.java | 92 +++++++++++++++++++ ...oducerOutputTypeSelectListWithClassTest.java | 93 ++++++++++++++++++++ 5 files changed, 201 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/92135be4/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlConsumer.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlConsumer.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlConsumer.java index 8f9800c..7ec7bd7 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlConsumer.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlConsumer.java @@ -99,7 +99,7 @@ public class SqlConsumer extends ScheduledBatchPollingConsumer { try { log.trace("Got result list from query: {}, outputType={}", rs, outputType); if (outputType == SqlOutputType.SelectList) { - List<Map<String, Object>> data = getEndpoint().queryForList(rs); + List<?> data = getEndpoint().queryForList(rs, true); addListToQueue(data, answer); } else if (outputType == SqlOutputType.SelectOne) { Object data = getEndpoint().queryForObject(rs); http://git-wip-us.apache.org/repos/asf/camel/blob/92135be4/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlEndpoint.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlEndpoint.java index 2df9f23..5c0ced2 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlEndpoint.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlEndpoint.java @@ -252,11 +252,19 @@ public class SqlEndpoint extends DefaultPollingEndpoint { return "sql:" + UnsafeUriCharactersEncoder.encode(query); } - protected List<Map<String, Object>> queryForList(ResultSet rs) throws SQLException { - ColumnMapRowMapper rowMapper = new ColumnMapRowMapper(); - RowMapperResultSetExtractor<Map<String, Object>> mapper = new RowMapperResultSetExtractor<Map<String, Object>>(rowMapper); - List<Map<String, Object>> data = mapper.extractData(rs); - return data; + protected List<?> queryForList(ResultSet rs, boolean allowMapToClass) throws SQLException { + if (allowMapToClass && outputClass != null) { + Class<?> outputClzz = getCamelContext().getClassResolver().resolveClass(outputClass); + RowMapper rowMapper = new BeanPropertyRowMapper(outputClzz); + RowMapperResultSetExtractor<?> mapper = new RowMapperResultSetExtractor(rowMapper); + List<?> data = mapper.extractData(rs); + return data; + } else { + ColumnMapRowMapper rowMapper = new ColumnMapRowMapper(); + RowMapperResultSetExtractor<Map<String, Object>> mapper = new RowMapperResultSetExtractor<Map<String, Object>>(rowMapper); + List<Map<String, Object>> data = mapper.extractData(rs); + return data; + } } @SuppressWarnings("unchecked") http://git-wip-us.apache.org/repos/asf/camel/blob/92135be4/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java index 75ff08b..c7c2e60 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java @@ -128,7 +128,7 @@ public class SqlProducer extends DefaultProducer { SqlOutputType outputType = getEndpoint().getOutputType(); log.trace("Got result list from query: {}, outputType={}", rs, outputType); if (outputType == SqlOutputType.SelectList) { - List<Map<String, Object>> data = getEndpoint().queryForList(rs); + List<?> data = getEndpoint().queryForList(rs, true); // for noop=true we still want to enrich with the row count header if (getEndpoint().isNoop()) { exchange.getOut().setBody(exchange.getIn().getBody()); @@ -161,7 +161,7 @@ public class SqlProducer extends DefaultProducer { exchange.getOut().setHeader(SqlConstants.SQL_GENERATED_KEYS_DATA, Collections.EMPTY_LIST); exchange.getOut().setHeader(SqlConstants.SQL_GENERATED_KEYS_ROW_COUNT, 0); } else { - List<Map<String, Object>> generatedKeys = getEndpoint().queryForList(ps.getGeneratedKeys()); + List<?> generatedKeys = getEndpoint().queryForList(ps.getGeneratedKeys(), false); exchange.getOut().setHeader(SqlConstants.SQL_GENERATED_KEYS_DATA, generatedKeys); exchange.getOut().setHeader(SqlConstants.SQL_GENERATED_KEYS_ROW_COUNT, generatedKeys.size()); } http://git-wip-us.apache.org/repos/asf/camel/blob/92135be4/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlConsumerOutputTypeSelectListWithClassTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlConsumerOutputTypeSelectListWithClassTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlConsumerOutputTypeSelectListWithClassTest.java new file mode 100644 index 0000000..538d237 --- /dev/null +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlConsumerOutputTypeSelectListWithClassTest.java @@ -0,0 +1,92 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.sql; + +import java.util.List; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +/** + * + */ +public class SqlConsumerOutputTypeSelectListWithClassTest extends CamelTestSupport { + + private EmbeddedDatabase db; + + @Before + public void setUp() throws Exception { + db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.DERBY).addScript("sql/createAndPopulateDatabase.sql").build(); + + super.setUp(); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + + db.shutdown(); + } + + @Test + public void testOutputType() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMinimumMessageCount(3); + + assertMockEndpointsSatisfied(); + + List<Exchange> exchanges = mock.getReceivedExchanges(); + assertTrue(exchanges.size() >= 3); + + ProjectModel row = assertIsInstanceOf(ProjectModel.class, exchanges.get(0).getIn().getBody()); + assertEquals(1, row.getId()); + assertEquals("Camel", row.getProject()); + assertEquals("ASF", row.getLicense()); + + ProjectModel row2 = assertIsInstanceOf(ProjectModel.class, exchanges.get(1).getIn().getBody()); + assertEquals(2, row2.getId()); + assertEquals("AMQ", row2.getProject()); + assertEquals("ASF", row2.getLicense()); + + ProjectModel row3 = assertIsInstanceOf(ProjectModel.class, exchanges.get(2).getIn().getBody()); + assertEquals(3, row3.getId()); + assertEquals("Linux", row3.getProject()); + assertEquals("XXX", row3.getLicense()); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + getContext().getComponent("sql", SqlComponent.class).setDataSource(db); + + from("sql:select * from projects order by id?outputType=SelectList&outputClass=org.apache.camel.component.sql.ProjectModel") + .to("mock:result"); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/92135be4/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerOutputTypeSelectListWithClassTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerOutputTypeSelectListWithClassTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerOutputTypeSelectListWithClassTest.java new file mode 100644 index 0000000..8ccbea2 --- /dev/null +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerOutputTypeSelectListWithClassTest.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.sql; + +import java.util.List; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +/** + * @version + */ +public class SqlProducerOutputTypeSelectListWithClassTest extends CamelTestSupport { + + private EmbeddedDatabase db; + + @Before + public void setUp() throws Exception { + db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.DERBY).addScript("sql/createAndPopulateDatabase.sql").build(); + + super.setUp(); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + + db.shutdown(); + } + + @Test + public void testOutputType() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + + template.sendBody("direct:start", "testmsg"); + + mock.assertIsSatisfied(); + + List<?> received = assertIsInstanceOf(List.class, mock.getReceivedExchanges().get(0).getIn().getBody()); + assertEquals(3, received.size()); + + ProjectModel row = assertIsInstanceOf(ProjectModel.class, received.get(0)); + assertEquals(1, row.getId()); + assertEquals("Camel", row.getProject()); + assertEquals("ASF", row.getLicense()); + + ProjectModel row2 = assertIsInstanceOf(ProjectModel.class, received.get(1)); + assertEquals(2, row2.getId()); + assertEquals("AMQ", row2.getProject()); + assertEquals("ASF", row2.getLicense()); + + ProjectModel row3 = assertIsInstanceOf(ProjectModel.class, received.get(2)); + assertEquals(3, row3.getId()); + assertEquals("Linux", row3.getProject()); + assertEquals("XXX", row3.getLicense()); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() { + getContext().getComponent("sql", SqlComponent.class).setDataSource(db); + + from("direct:start") + .to("sql:select * from projects order by id?outputType=SelectList&outputClass=org.apache.camel.component.sql.ProjectModel") + .to("mock:result"); + } + }; + } +}
