This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-3.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-3.x by this push: new a561c7260ae Adding support to named parameters on queries provided by using the C… (#9480) a561c7260ae is described below commit a561c7260ae078e9e1ef6e7bbdcb9dc1fc0ddaeb Author: Adriano Machado <60320+ammach...@users.noreply.github.com> AuthorDate: Wed Mar 8 04:54:47 2023 -0500 Adding support to named parameters on queries provided by using the C… (#9480) * Adding support to named parameters on queries provided by using the CamelSqlQuery header * Fixing failing test --------- Co-authored-by: Adriano Machado <admac...@redhat.com> --- .../org/apache/camel/component/sql/SqlHelper.java | 30 +++++++++++++--------- .../apache/camel/component/sql/SqlProducer.java | 7 ++++- .../apache/camel/component/sql/SqlRouteTest.java | 15 +++++++++++ 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlHelper.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlHelper.java index 12ff82a0b6d..28df085074f 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlHelper.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlHelper.java @@ -39,20 +39,26 @@ public final class SqlHelper { try (InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, query)) { answer = camelContext.getTypeConverter().mandatoryConvertTo(String.class, is); } - if (placeholder != null) { - answer = answer.replaceAll(placeholder, "?"); - } - // skip lines with comments - StringJoiner sj = new StringJoiner("\n"); - String[] lines = answer.split("\n"); - for (String line : lines) { - String trim = line.trim(); - if (!trim.isEmpty() && !trim.startsWith("--")) { - sj.add(line); - } + answer = resolvePlaceholders(answer, placeholder); + } + return answer; + } + + public static String resolvePlaceholders(String query, String placeholder) { + String answer = query; + if (placeholder != null) { + answer = answer.replaceAll(placeholder, "?"); + } + // skip lines with comments + StringJoiner sj = new StringJoiner("\n"); + String[] lines = answer.split("\n"); + for (String line : lines) { + String trim = line.trim(); + if (!trim.isEmpty() && !trim.startsWith("--")) { + sj.add(line); } - answer = sj.toString(); } + answer = sj.toString(); return answer; } } 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 7af835a77fb..60ce63382a5 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 @@ -98,7 +98,12 @@ public class SqlProducer extends DefaultProducer { sql = exchange.getIn().getBody(String.class); } else { String queryHeader = exchange.getIn().getHeader(SqlConstants.SQL_QUERY, String.class); - sql = queryHeader != null ? queryHeader : resolvedQuery; + if (queryHeader != null) { + String placeholder = getEndpoint().isUsePlaceholder() ? getEndpoint().getPlaceholder() : null; + sql = SqlHelper.resolvePlaceholders(queryHeader, placeholder); + } else { + sql = resolvedQuery; + } } final String preparedQuery = sqlPrepareStatementStrategy.prepareQuery(sql, getEndpoint().isAllowNamedParameters(), exchange); diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java index 6e2381cbb8b..317c6445c26 100644 --- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java @@ -23,9 +23,11 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.support.DefaultExchange; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -82,6 +84,19 @@ public class SqlRouteTest extends CamelTestSupport { row = assertIsInstanceOf(Map.class, received.get(0)); assertEquals("Linux", row.get("PROJECT")); assertEquals("XXX", row.get("license")); + mock.reset(); + + mock.expectedMessageCount(1); + Exchange exchange = new DefaultExchange(context); + exchange.getMessage().setHeader(SqlConstants.SQL_QUERY, "select * from projects where id = :#id order by id"); + exchange.getMessage().setHeader("id", 1); + template.send("direct:simple", exchange); + mock.assertIsSatisfied(); + received = assertIsInstanceOf(List.class, mock.getReceivedExchanges().get(0).getIn().getBody()); + row = assertIsInstanceOf(Map.class, received.get(0)); + assertEquals(1, row.get("id")); + assertEquals("ASF", row.get("license")); + mock.reset(); } @Test