Skip to content

Commit f0ecbf2

Browse files
closes #119 Add support for <db:select /> in mule
* SBM now supports DB select * DB select component brings in the necessary dependencies * Db Select autowires jdbc template * Refactor: DB select removes duplicacy * DB:Select should handle non-limited queries * Removing unused imports Co-authored-by: Sandeep Nagaraj (@sanagaraj-pivotal)
1 parent 711276a commit f0ecbf2

File tree

4 files changed

+126
-8
lines changed

4 files changed

+126
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* Copyright 2021 - 2022 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.sbm.mule.actions.javadsl.translators.db;
17+
18+
import org.mulesoft.schema.mule.db.SelectMessageProcessorType;
19+
import org.springframework.sbm.mule.actions.javadsl.translators.Bean;
20+
import org.springframework.sbm.mule.actions.javadsl.translators.DslSnippet;
21+
import org.springframework.sbm.mule.actions.javadsl.translators.MuleComponentToSpringIntegrationDslTranslator;
22+
import org.springframework.sbm.mule.api.toplevel.configuration.MuleConfigurations;
23+
import org.springframework.stereotype.Component;
24+
25+
import javax.xml.namespace.QName;
26+
import java.util.Collections;
27+
import java.util.Map;
28+
import java.util.Set;
29+
30+
@Component
31+
public class SelectTranslator implements MuleComponentToSpringIntegrationDslTranslator<SelectMessageProcessorType> {
32+
33+
@Override
34+
public Class<SelectMessageProcessorType> getSupportedMuleType() {
35+
return SelectMessageProcessorType.class;
36+
}
37+
38+
@Override
39+
public DslSnippet translate(SelectMessageProcessorType component,
40+
QName name,
41+
MuleConfigurations muleConfigurations,
42+
String flowName,
43+
Map<Class, MuleComponentToSpringIntegrationDslTranslator> translatorsMap) {
44+
45+
String limitString = component.getMaxRows() == null ? "" : " LIMIT " + component.getMaxRows();
46+
47+
return new DslSnippet("// TODO: substitute expression language with appropriate java code \n" +
48+
" .handle((p, h) -> jdbcTemplate.queryForList(\"" +
49+
escapeDoubleQuotes(component.getDynamicQuery())
50+
+ limitString + "\"))",
51+
Collections.emptySet(),
52+
Set.of(
53+
"org.springframework.boot:spring-boot-starter-jdbc:2.5.5",
54+
"org.springframework.integration:spring-integration-jdbc:5.5.4"
55+
),
56+
Set.of(new Bean("jdbcTemplate", "org.springframework.jdbc.core.JdbcTemplate"))
57+
);
58+
}
59+
60+
private String escapeDoubleQuotes(String str) {
61+
return str.replace("\"", "\\\"");
62+
}
63+
}

components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/JavaDSLActionBaseTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.sbm.mule.actions.javadsl.translators.amqp.AmqpOutboundEndpointTranslator;
2525
import org.springframework.sbm.mule.actions.javadsl.translators.common.ExpressionLanguageTranslator;
2626
import org.springframework.sbm.mule.actions.javadsl.translators.core.*;
27+
import org.springframework.sbm.mule.actions.javadsl.translators.db.SelectTranslator;
2728
import org.springframework.sbm.mule.actions.javadsl.translators.dwl.DwlTransformTranslator;
2829
import org.springframework.sbm.mule.actions.javadsl.translators.http.HttpListenerConfigTypeAdapter;
2930
import org.springframework.sbm.mule.actions.javadsl.translators.http.HttpListenerTranslator;
@@ -74,7 +75,8 @@ public void setup() {
7475
new WmqInboundEndpointTranslator(),
7576
new DwlTransformTranslator(),
7677
new HttpRequestTranslator(),
77-
new ChoiceTranslator()
78+
new ChoiceTranslator(),
79+
new SelectTranslator()
7880
);
7981
List<TopLevelElementFactory> topLevelTypeFactories = List.of(
8082
new FlowTopLevelElementFactory(translators),

components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLDBTest.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@
1616
package org.springframework.sbm.mule.actions;
1717

1818
import org.junit.jupiter.api.Test;
19+
import org.springframework.sbm.build.api.Dependency;
20+
21+
import java.util.Set;
22+
import java.util.stream.Collectors;
1923

2024
import static org.assertj.core.api.Assertions.assertThat;
2125

22-
public class MuleToJavaDSLDBTest extends JavaDSLActionBaseTest {
26+
public class MuleToJavaDSLDBTest extends JavaDSLActionBaseTest {
2327

2428
@Test
25-
public void sbmHasKnowledgeOfDBNamespace() {
29+
public void translateDbSelectQuery() {
2630
String muleXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
2731
"\n" +
2832
"<mule xmlns:db=\"http://www.mulesoft.org/schema/mule/db\" xmlns:http=\"http://www.mulesoft.org/schema/mule/http\" xmlns=\"http://www.mulesoft.org/schema/mule/core\" xmlns:doc=\"http://www.mulesoft.org/schema/mule/documentation\"\n" +
@@ -36,13 +40,24 @@ public void sbmHasKnowledgeOfDBNamespace() {
3640
" <flow name=\"dbFlow\">\n" +
3741
" <http:listener config-ref=\"HTTP_Listener_Configuration\" path=\"/\" doc:name=\"HTTP\"/>\n" +
3842
" <logger level=\"INFO\" doc:name=\"Logger\"/>\n" +
39-
" <db:select config-ref=\"MySQL_Configuration\" doc:name=\"Database\">\n" +
40-
" <db:parameterized-query/>\n" +
41-
" </db:select>\n" +
43+
" <db:select config-ref=\"MySQL_Configuration\" doc:name=\"Database\" fetchSize=\"500\" maxRows=\"500\">\n" +
44+
" <db:dynamic-query><![CDATA[SELECT * FROM STUDENTS]]></db:dynamic-query>\n" +
45+
" </db:select>" +
4246
" </flow>\n" +
4347
"</mule>\n";
48+
4449
addXMLFileToResource(muleXml);
4550
runAction();
51+
52+
Set<String> listOfImportedArtifacts = projectContext
53+
.getBuildFile()
54+
.getDeclaredDependencies()
55+
.stream()
56+
.map(Dependency::getArtifactId)
57+
.collect(Collectors.toSet());
58+
59+
assertThat(listOfImportedArtifacts).contains("spring-integration-jdbc");
60+
assertThat(listOfImportedArtifacts).contains("spring-boot-starter-jdbc");
4661
assertThat(projectContext.getProjectJavaSources().list()).hasSize(1);
4762
assertThat(projectContext.getProjectJavaSources().list().get(0).print())
4863
.isEqualTo(
@@ -61,10 +76,11 @@ public void sbmHasKnowledgeOfDBNamespace() {
6176
" }\n" +
6277
"\n" +
6378
" @Bean\n" +
64-
" IntegrationFlow dbFlow() {\n" +
79+
" IntegrationFlow dbFlow(org.springframework.jdbc.core.JdbcTemplate jdbcTemplate) {\n" +
6580
" return IntegrationFlows.from(Http.inboundChannelAdapter(\"/\")).handle((p, h) -> p)\n" +
6681
" .log(LoggingHandler.Level.INFO)\n" +
67-
" //FIXME: element is not supported for conversion: <db:select/>\n" +
82+
" // TODO: substitute expression language with appropriate java code \n" +
83+
" .handle((p, h) -> jdbcTemplate.queryForList(\"SELECT * FROM STUDENTS LIMIT 500\"))\n" +
6884
" .get();\n" +
6985
" }}");
7086
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.springframework.sbm.mule.actions.javadsl.translators.db;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
import org.mulesoft.schema.mule.db.SelectMessageProcessorType;
6+
import org.springframework.sbm.mule.actions.javadsl.translators.DslSnippet;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
class SelectTranslatorTest {
11+
12+
private final SelectTranslator target = new SelectTranslator();
13+
private SelectMessageProcessorType input;
14+
15+
@BeforeEach
16+
public void setup() {
17+
input = new SelectMessageProcessorType();
18+
}
19+
20+
@Test
21+
public void itShouldEscapeDoubleQuotes() {
22+
23+
input.setMaxRows("500");
24+
input.setDynamicQuery("Select * from Students where name like \"Sandeep\"");
25+
DslSnippet output = target.translate(input, null, null, null, null);
26+
27+
assertThat(output.getRenderedSnippet()).isEqualTo("// TODO: substitute expression language with appropriate java code \n " + " .handle((p, h) -> jdbcTemplate.queryForList(\"Select * from Students where name like \\\"Sandeep\\\" LIMIT 500\"))");
28+
}
29+
30+
@Test
31+
public void itShouldOmitLimitWhenMaxRowsIsNotAvailable() {
32+
input.setDynamicQuery("Select * from Students where name like \"Sandeep\"");
33+
DslSnippet output = target.translate(input, null, null, null, null);
34+
35+
assertThat(output.getRenderedSnippet()).isEqualTo("// TODO: substitute expression language with appropriate java code \n " + " .handle((p, h) -> jdbcTemplate.queryForList(\"Select * from Students where name like \\\"Sandeep\\\"\"))");
36+
}
37+
}

0 commit comments

Comments
 (0)