Skip to content

Commit b40046a

Browse files
130 Support foreach (#136)
1 parent 5bde20a commit b40046a

File tree

8 files changed

+406
-4
lines changed

8 files changed

+406
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package org.springframework.sbm.mule.actions.javadsl.translators.core;
2+
3+
import org.mulesoft.schema.mule.core.ForeachProcessorType;
4+
import org.springframework.sbm.mule.actions.javadsl.translators.Bean;
5+
import org.springframework.sbm.mule.actions.javadsl.translators.DslSnippet;
6+
import org.springframework.sbm.mule.actions.javadsl.translators.MuleComponentToSpringIntegrationDslTranslator;
7+
import org.springframework.sbm.mule.api.toplevel.ForeachTopLevelElement;
8+
import org.springframework.sbm.mule.api.toplevel.configuration.MuleConfigurations;
9+
import org.springframework.stereotype.Component;
10+
11+
import javax.xml.namespace.QName;
12+
import java.util.Collection;
13+
import java.util.Map;
14+
import java.util.Set;
15+
import java.util.stream.Collectors;
16+
17+
import static java.util.Collections.emptySet;
18+
19+
@Component
20+
public class ForeachTranslator implements MuleComponentToSpringIntegrationDslTranslator<ForeachProcessorType> {
21+
@Override
22+
public Class<ForeachProcessorType> getSupportedMuleType() {
23+
return ForeachProcessorType.class;
24+
}
25+
26+
@Override
27+
public DslSnippet translate(int id,
28+
ForeachProcessorType component,
29+
QName name,
30+
MuleConfigurations muleConfigurations,
31+
String flowName,
32+
Map<Class, MuleComponentToSpringIntegrationDslTranslator> translatorsMap
33+
) {
34+
35+
ForeachTopLevelElement forEachTopLevelTranslations =
36+
new ForeachTopLevelElement(
37+
flowName,
38+
component.getMessageProcessorOrOutboundEndpoint(),
39+
muleConfigurations,
40+
translatorsMap
41+
);
42+
43+
Set<Bean> beans = forEachTopLevelTranslations
44+
.getDslSnippets()
45+
.stream()
46+
.map(DslSnippet::getBeans)
47+
.flatMap(Collection::stream)
48+
.collect(Collectors.toSet());
49+
50+
51+
Set<String> requiredImports = forEachTopLevelTranslations
52+
.getDslSnippets()
53+
.stream()
54+
.map(DslSnippet::getRequiredImports)
55+
.flatMap(Collection::stream)
56+
.collect(Collectors.toSet());
57+
58+
Set<String> dependencies = forEachTopLevelTranslations
59+
.getDslSnippets()
60+
.stream()
61+
.map(DslSnippet::getRequiredDependencies)
62+
.flatMap(Collection::stream)
63+
.collect(Collectors.toSet());
64+
65+
return new DslSnippet(
66+
" //TODO: translate expression " + component.getCollection() + " which must produces an array\n" +
67+
" // to iterate over\n" +
68+
" .split()\n" +
69+
" " + forEachTopLevelTranslations.renderDslSnippet() + "\n" +
70+
" .aggregate()",
71+
requiredImports,
72+
dependencies,
73+
beans
74+
);
75+
}
76+
}

components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/SelectTranslator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ public DslSnippet translate(int id, SelectMessageProcessorType component,
4444

4545
String limitString = component.getMaxRows() == null ? "" : " LIMIT " + component.getMaxRows();
4646

47+
String query = component.getDynamicQuery() == null ? component.getParameterizedQuery()
48+
: component.getDynamicQuery();
4749
return new DslSnippet("// TODO: substitute expression language with appropriate java code \n" +
4850
" .handle((p, h) -> jdbcTemplate.queryForList(\"" +
49-
escapeDoubleQuotes(component.getDynamicQuery())
51+
escapeDoubleQuotes(query)
5052
+ limitString + "\"))",
5153
Collections.emptySet(),
5254
Set.of(

components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/api/toplevel/ApiRouterKitFlowTopLevelElement.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ protected String composeSuffixDslCode() {
6565
public Set<String> getRequiredImports() {
6666
Set<String> requiredImports = super.getRequiredImports();
6767
requiredImports.add("org.springframework.http.HttpMethod");
68+
requiredImports.add("org.springframework.integration.http.dsl.Http");
6869
return requiredImports;
6970
}
7071

components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/api/toplevel/ChoiceTopLevelElement.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public String renderDslSnippet() {
3535
Set<String> requiredImports = getRequiredImports();
3636
requiredImports.add("org.springframework.integration.dsl.IntegrationFlow");
3737
requiredImports.add("org.springframework.integration.dsl.IntegrationFlows");
38-
requiredImports.add("org.springframework.integration.amqp.dsl.Amqp");
3938
getDslSnippets().forEach(ds -> requiredImports.addAll(ds.getRequiredImports()));
4039
return sb.toString();
4140
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.springframework.sbm.mule.api.toplevel;
2+
3+
import org.springframework.sbm.mule.actions.javadsl.translators.DslSnippet;
4+
import org.springframework.sbm.mule.actions.javadsl.translators.MuleComponentToSpringIntegrationDslTranslator;
5+
import org.springframework.sbm.mule.api.toplevel.configuration.MuleConfigurations;
6+
7+
import javax.xml.bind.JAXBElement;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.stream.Collectors;
11+
12+
public class ForeachTopLevelElement extends AbstractTopLevelElement{
13+
14+
protected String composePrefixDslCode() {
15+
return "";
16+
}
17+
18+
public String renderDslSnippet() {
19+
StringBuilder sb = new StringBuilder();
20+
String dsl = getDslSnippets().stream().map(DslSnippet::getRenderedSnippet).collect(Collectors.joining("\n"));
21+
sb.append(dsl);
22+
return sb.toString();
23+
}
24+
25+
public ForeachTopLevelElement(String flowName,
26+
List<JAXBElement<?>> elements,
27+
MuleConfigurations muleConfigurations,
28+
Map<Class, MuleComponentToSpringIntegrationDslTranslator> translatorsMap) {
29+
super(flowName, elements, muleConfigurations, translatorsMap);
30+
}
31+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ public void setup() {
7676
new DwlTransformTranslator(),
7777
new HttpRequestTranslator(),
7878
new ChoiceTranslator(),
79-
new SelectTranslator()
79+
new SelectTranslator(),
80+
new ForeachTranslator()
8081
);
8182
List<TopLevelElementFactory> topLevelTypeFactories = List.of(
8283
new FlowTopLevelElementFactory(translators),

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

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
public class MuleToJavaDSLDBTest extends JavaDSLActionBaseTest {
2727

2828
@Test
29-
public void translateDbSelectQuery() {
29+
public void translateDbSelectDynamicQuery() {
3030
String muleXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
3131
"\n" +
3232
"<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" +
@@ -84,4 +84,54 @@ public void translateDbSelectQuery() {
8484
" .get();\n" +
8585
" }}");
8686
}
87+
88+
@Test
89+
public void translateDbSelectParameterisedQuery() {
90+
String muleXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
91+
"\n" +
92+
"<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" +
93+
" xmlns:spring=\"http://www.springframework.org/schema/beans\" \n" +
94+
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
95+
" xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd\n" +
96+
"http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd\n" +
97+
"http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd\n" +
98+
"http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd\">\n" +
99+
" <db:mysql-config name=\"MySQL_Configuration\" host=\"localhost\" port=\"3036\" user=\"root\" password=\"root\" doc:name=\"MySQL Configuration\"/>\n" +
100+
" <flow name=\"dbFlow\">\n" +
101+
" <http:listener config-ref=\"HTTP_Listener_Configuration\" path=\"/\" doc:name=\"HTTP\"/>\n" +
102+
" <logger level=\"INFO\" doc:name=\"Logger\"/>\n" +
103+
" <db:select config-ref=\"MySQL_Configuration\" doc:name=\"Database\" fetchSize=\"500\" maxRows=\"500\">\n" +
104+
" <db:parameterized-query><![CDATA[SELECT * FROM STUDENTS]]></db:parameterized-query>\n" +
105+
" </db:select>" +
106+
" </flow>\n" +
107+
"</mule>\n";
108+
109+
addXMLFileToResource(muleXml);
110+
runAction();
111+
assertThat(projectContext.getProjectJavaSources().list()).hasSize(1);
112+
assertThat(projectContext.getProjectJavaSources().list().get(0).print())
113+
.isEqualTo(
114+
"package com.example.javadsl;\n" +
115+
"import org.springframework.context.annotation.Bean;\n" +
116+
"import org.springframework.context.annotation.Configuration;\n" +
117+
"import org.springframework.integration.dsl.IntegrationFlow;\n" +
118+
"import org.springframework.integration.dsl.IntegrationFlows;\n" +
119+
"import org.springframework.integration.handler.LoggingHandler;\n" +
120+
"import org.springframework.integration.http.dsl.Http;\n" +
121+
"\n" +
122+
"@Configuration\n" +
123+
"public class FlowConfigurations {\n" +
124+
" void dbMysql_config() {\n" +
125+
" //FIXME: element is not supported for conversion: <db:mysql-config/>\n" +
126+
" }\n" +
127+
"\n" +
128+
" @Bean\n" +
129+
" IntegrationFlow dbFlow(org.springframework.jdbc.core.JdbcTemplate jdbcTemplate) {\n" +
130+
" return IntegrationFlows.from(Http.inboundChannelAdapter(\"/\")).handle((p, h) -> p)\n" +
131+
" .log(LoggingHandler.Level.INFO)\n" +
132+
" // TODO: substitute expression language with appropriate java code \n" +
133+
" .handle((p, h) -> jdbcTemplate.queryForList(\"SELECT * FROM STUDENTS LIMIT 500\"))\n" +
134+
" .get();\n" +
135+
" }}");
136+
}
87137
}

0 commit comments

Comments
 (0)