diff --git a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/core/ChoiceTranslator.java b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/core/ChoiceTranslator.java index 16fa8a3b1..5aa818e68 100644 --- a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/core/ChoiceTranslator.java +++ b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/core/ChoiceTranslator.java @@ -61,24 +61,6 @@ public DslSnippet translate(int id, SelectiveOutboundRouterType component, translatorsMap))) .collect(Collectors.toList()); - String otherwiseSubflowMappings = ""; - - if (component.getOtherwise() != null) { - ChoiceTopLevelElement otherWiseStatement = new ChoiceTopLevelElement( - flowName, - component.getOtherwise().getMessageProcessorOrOutboundEndpoint(), - muleConfigurations, - translatorsMap); - - otherwiseSubflowMappings = defaultSubflowMapping.replace( - "$OTHERWISE_STATEMENTS", - otherWiseStatement.renderDslSnippet() - ); - - otherwiseSubflowMappings = " .resolutionRequired(false)\n" + - otherwiseSubflowMappings; - } - String whenSubflowMappings = whenStatements .stream() .map(item -> @@ -88,26 +70,54 @@ public DslSnippet translate(int id, SelectiveOutboundRouterType component, ) .collect(Collectors.joining()); + List whenStatementDslSnippets = whenStatements + .stream() + .map(item -> DslSnippet.createDSLSnippetFromTopLevelElement(item.getValue())) + .collect(Collectors.toList()); - Set requiredImports = whenStatements.stream() - .map(item -> item.getValue().getRequiredImports()) + Set requiredImports = whenStatementDslSnippets + .stream() + .map(DslSnippet::getRequiredImports) .flatMap(Collection::stream) .collect(Collectors.toSet()); + requiredImports.add("org.springframework.util.LinkedMultiValueMap"); - Set requiredBeans = whenStatements.stream() - .map(item -> item.getValue().getDslSnippets()) - .flatMap(Collection::stream) + Set requiredBeans = whenStatementDslSnippets.stream() .map(DslSnippet::getBeans) .flatMap(Collection::stream) .collect(Collectors.toSet()); - Set requiredDependencies = whenStatements.stream() - .map(item -> item.getValue().getRequiredDependencies()) + Set requiredDependencies = whenStatementDslSnippets.stream() + .map(DslSnippet::getRequiredDependencies) .flatMap(Collection::stream) .collect(Collectors.toSet()); + String otherwiseSubflowMappings = ""; + + if (component.getOtherwise() != null) { + ChoiceTopLevelElement otherWiseStatement = new ChoiceTopLevelElement( + flowName, + component.getOtherwise().getMessageProcessorOrOutboundEndpoint(), + muleConfigurations, + translatorsMap); + + DslSnippet otherWiseDSLSnippet = DslSnippet.createDSLSnippetFromTopLevelElement(otherWiseStatement); + + requiredImports.addAll(otherWiseDSLSnippet.getRequiredImports()); + requiredDependencies.addAll(otherWiseDSLSnippet.getRequiredDependencies()); + requiredBeans.addAll(otherWiseDSLSnippet.getBeans()); + + otherwiseSubflowMappings = defaultSubflowMapping.replace( + "$OTHERWISE_STATEMENTS", + otherWiseStatement.renderDslSnippet() + ); + + otherwiseSubflowMappings = " .resolutionRequired(false)\n" + + otherwiseSubflowMappings; + } + return DslSnippet.builder() .renderedSnippet("/* TODO: LinkedMultiValueMap might not be apt, substitute with right input type*/\n" + " ., String>route(\n" + diff --git a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/DBCommons.java b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/DBCommons.java new file mode 100644 index 000000000..0126dd507 --- /dev/null +++ b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/DBCommons.java @@ -0,0 +1,22 @@ +/* + * Copyright 2021 - 2022 the original author or authors. + * + * Licensed 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 + * + * https://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.springframework.sbm.mule.actions.javadsl.translators.db; + +public class DBCommons { + public static String escapeDoubleQuotes(String str) { + return str.replace("\"", "\\\""); + } +} diff --git a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/InsertTranslator.java b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/InsertTranslator.java new file mode 100644 index 000000000..0824b9c8a --- /dev/null +++ b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/InsertTranslator.java @@ -0,0 +1,62 @@ +/* + * Copyright 2021 - 2022 the original author or authors. + * + * Licensed 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 + * + * https://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.springframework.sbm.mule.actions.javadsl.translators.db; + +import org.mulesoft.schema.mule.db.InsertMessageProcessorType; +import org.springframework.sbm.mule.actions.javadsl.translators.Bean; +import org.springframework.sbm.mule.actions.javadsl.translators.DslSnippet; +import org.springframework.sbm.mule.actions.javadsl.translators.MuleComponentToSpringIntegrationDslTranslator; +import org.springframework.sbm.mule.api.toplevel.configuration.MuleConfigurations; +import org.springframework.stereotype.Component; + +import javax.xml.namespace.QName; +import java.util.Map; +import java.util.Set; + +@Component +public class InsertTranslator implements MuleComponentToSpringIntegrationDslTranslator { + @Override + public Class getSupportedMuleType() { + return InsertMessageProcessorType.class; + } + + @Override + public DslSnippet translate(int id, + InsertMessageProcessorType component, + QName name, + MuleConfigurations muleConfigurations, + String flowName, + Map translatorsMap) { + return DslSnippet.builder() + .renderedSnippet( + " // TODO: payload type might not be always LinkedMultiValueMap please change it to appropriate type \n" + + " // TODO: mule expression language is not converted to java, do it manually. example: #[payload] etc \n" + + " .>handle((p, h) -> {\n" + + " jdbcTemplate.execute(\"" + DBCommons.escapeDoubleQuotes(component.getParameterizedQuery()) + "\");\n" + + " return p;\n" + + " })") + .requiredImports(Set.of( + "org.springframework.util.LinkedMultiValueMap", + "org.springframework.jdbc.core.JdbcTemplate" + )) + .requiredDependencies(Set.of( + "org.springframework.boot:spring-boot-starter-jdbc:2.5.5", + "org.springframework.integration:spring-integration-jdbc:5.5.4" + )) + .beans(Set.of(new Bean("jdbcTemplate", "org.springframework.jdbc.core.JdbcTemplate"))) + .build(); + } +} diff --git a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/SelectTranslator.java b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/SelectTranslator.java index af0660410..a2d14f607 100644 --- a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/SelectTranslator.java +++ b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/db/SelectTranslator.java @@ -23,10 +23,11 @@ import org.springframework.stereotype.Component; import javax.xml.namespace.QName; -import java.util.Collections; import java.util.Map; import java.util.Set; +import static org.springframework.sbm.mule.actions.javadsl.translators.db.DBCommons.escapeDoubleQuotes; + @Component public class SelectTranslator implements MuleComponentToSpringIntegrationDslTranslator { @@ -56,11 +57,14 @@ public DslSnippet translate(int id, SelectMessageProcessorType component, "org.springframework.boot:spring-boot-starter-jdbc:2.5.5", "org.springframework.integration:spring-integration-jdbc:5.5.4" )) - .beans(Set.of(new Bean("jdbcTemplate", "org.springframework.jdbc.core.JdbcTemplate"))) + .beans( + Set.of( + new Bean( + "jdbcTemplate", + "org.springframework.jdbc.core.JdbcTemplate" + ) + ) + ) .build(); } - - private String escapeDoubleQuotes(String str) { - return str.replace("\"", "\\\""); - } } diff --git a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/JavaDSLActionBaseTest.java b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/JavaDSLActionBaseTest.java index 669f8bc8d..6f583c3f9 100644 --- a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/JavaDSLActionBaseTest.java +++ b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/JavaDSLActionBaseTest.java @@ -24,6 +24,7 @@ import org.springframework.sbm.mule.actions.javadsl.translators.amqp.AmqpOutboundEndpointTranslator; import org.springframework.sbm.mule.actions.javadsl.translators.common.ExpressionLanguageTranslator; import org.springframework.sbm.mule.actions.javadsl.translators.core.*; +import org.springframework.sbm.mule.actions.javadsl.translators.db.InsertTranslator; import org.springframework.sbm.mule.actions.javadsl.translators.db.SelectTranslator; import org.springframework.sbm.mule.actions.javadsl.translators.dwl.DwlTransformTranslator; import org.springframework.sbm.mule.actions.javadsl.translators.http.HttpListenerConfigTypeAdapter; @@ -78,7 +79,8 @@ public void setup() { new ChoiceTranslator(), new SelectTranslator(), new ForeachTranslator(), - new TransactionalTranslator() + new TransactionalTranslator(), + new InsertTranslator() ); List topLevelTypeFactories = List.of( diff --git a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLChoiceTest.java b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLChoiceTest.java index 419d5ee22..eddea0ac9 100644 --- a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLChoiceTest.java +++ b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLChoiceTest.java @@ -300,4 +300,77 @@ public void nestedChoiceDoesNotError() { addXMLFileToResource(xmlNestedChoice); runAction(); } + + @Test + public void otherwiseStatementShouldDoImportsBeansAndDependencies() { + String xml = "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; + + addXMLFileToResource(xml); + runAction(); + + assertThat(getGeneratedJavaFile()).isEqualTo( + "package com.example.javadsl;\n" + + "import org.springframework.context.annotation.Bean;\n" + + "import org.springframework.context.annotation.Configuration;\n" + + "import org.springframework.http.HttpMethod;\n" + + "import org.springframework.integration.dsl.IntegrationFlow;\n" + + "import org.springframework.integration.dsl.IntegrationFlows;\n" + + "import org.springframework.integration.handler.LoggingHandler;\n" + + "import org.springframework.integration.http.dsl.Http;\n" + + "import org.springframework.jdbc.core.JdbcTemplate;\n" + + "import org.springframework.util.LinkedMultiValueMap;\n" + + "\n" + + "@Configuration\n" + + "public class FlowConfigurations {\n" + + " @Bean\n" + + " IntegrationFlow post__insert_application_json_cmb_hsbcnet_ss_sa_entitlement_change_request_config(org.springframework.jdbc.core.JdbcTemplate jdbcTemplate) {\n" + + " // FIXME: the base path for Http.inboundGateway must be extracted from http:listener in flow containing apikit:router with config-ref=\"cmb-hsbcnet-ss-sa-entitlement-change-request-config\"\n" + + " // FIXME: add all JavaDSL generated components between http:listener and apikit:router with config-ref=\"cmb-hsbcnet-ss-sa-entitlement-change-request-config\" into this flow\n" + + " // FIXME: remove the JavaDSL generated method containing apikit:router with config-ref=\"cmb-hsbcnet-ss-sa-entitlement-change-request-config\"\n" + + " return IntegrationFlows.from(\n" + + " Http.inboundGateway(\"/insert\").requestMapping(r -> r.methods(HttpMethod.POST)))\n" + + " /* TODO: LinkedMultiValueMap might not be apt, substitute with right input type*/\n" + + " ., String>route(\n" + + " p -> p.getFirst(\"dataKey\") /*TODO: use apt condition*/,\n" + + " m -> m\n" + + " .subFlowMapping(\"dataValue\" /*TODO: Translate dataValue to #[payload == null || payload.size() == 0]*/,\n" + + " sf -> sf.log(LoggingHandler.Level.DEBUG, \"empty details list: change request id ${flowVars.changeRequestId}\")\n" + + " )\n" + + " .resolutionRequired(false)\n" + + " .defaultSubFlowMapping(sf -> sf.log(LoggingHandler.Level.DEBUG, \"insert details: change request id ${flowVars.changeRequestId}\")\n" + + " // TODO: payload type might not be always LinkedMultiValueMap please change it to appropriate type \n" + + " // TODO: mule expression language is not converted to java, do it manually. example: #[payload] etc \n" + + " .>handle((p, h) -> {\n" + + " jdbcTemplate.execute(\"INSERT INTO ${ORA_SCHEMA}.CHANGE_REQUEST_DETAILS (CHANGE_REQUEST_ID, CR_ATTRIBUTE_ID, SECONDARY_ATTRIBUTE, OLD_VALUE, NEW_VALUE) VALUES (#[flowVars.changeRequestId], #[payload.crAttributeId], #[payload.secondaryAttribute], #[payload.oldValue], #[payload.newValue])\");\n" + + " return p;\n" + + " }))\n" + + " )\n" + + " .get();\n" + + " }}"); + } } diff --git a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/db/MuleToJavaDSLDBInsertTest.java b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/db/MuleToJavaDSLDBInsertTest.java new file mode 100644 index 000000000..7a9e6fdd0 --- /dev/null +++ b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/db/MuleToJavaDSLDBInsertTest.java @@ -0,0 +1,74 @@ +/* + * Copyright 2021 - 2022 the original author or authors. + * + * Licensed 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 + * + * https://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.springframework.sbm.mule.actions.db; + +import org.junit.jupiter.api.Test; +import org.springframework.sbm.mule.actions.JavaDSLActionBaseTest; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MuleToJavaDSLDBInsertTest extends JavaDSLActionBaseTest { + + @Test + public void dbInsert() { + String muleXml = "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " " + + " \n" + + "\n"; + + addXMLFileToResource(muleXml); + runAction(); + + assertThat(getGeneratedJavaFile()).isEqualTo( + "package com.example.javadsl;\n" + + "import org.springframework.context.annotation.Bean;\n" + + "import org.springframework.context.annotation.Configuration;\n" + + "import org.springframework.integration.dsl.IntegrationFlow;\n" + + "import org.springframework.integration.dsl.IntegrationFlows;\n" + + "import org.springframework.integration.handler.LoggingHandler;\n" + + "import org.springframework.integration.http.dsl.Http;\n" + + "import org.springframework.jdbc.core.JdbcTemplate;\n" + + "import org.springframework.util.LinkedMultiValueMap;\n" + + "\n" + + "@Configuration\n" + + "public class FlowConfigurations {\n" + + " @Bean\n" + + " IntegrationFlow dbFlow(org.springframework.jdbc.core.JdbcTemplate jdbcTemplate) {\n" + + " return IntegrationFlows.from(Http.inboundChannelAdapter(\"/\")).handle((p, h) -> p)\n" + + " .log(LoggingHandler.Level.INFO)\n" + + " // TODO: payload type might not be always LinkedMultiValueMap please change it to appropriate type \n" + + " // TODO: mule expression language is not converted to java, do it manually. example: #[payload] etc \n" + + " .>handle((p, h) -> {\n" + + " jdbcTemplate.execute(\"INSERT INTO STUDENTS (NAME, AGE, CITY) VALUES (#[payload.name], #[payload.age], #[payload.city])\");\n" + + " return p;\n" + + " })\n" + + " .get();\n" + + " }}"); + } +} diff --git a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLDBTest.java b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/db/MuleToJavaDSLDBSelectTest.java similarity index 97% rename from components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLDBTest.java rename to components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/db/MuleToJavaDSLDBSelectTest.java index 236800b6a..a3ff71ec6 100644 --- a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLDBTest.java +++ b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/db/MuleToJavaDSLDBSelectTest.java @@ -13,17 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.sbm.mule.actions; +package org.springframework.sbm.mule.actions.db; import org.junit.jupiter.api.Test; import org.springframework.sbm.build.api.Dependency; +import org.springframework.sbm.mule.actions.JavaDSLActionBaseTest; import java.util.Set; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; -public class MuleToJavaDSLDBTest extends JavaDSLActionBaseTest { +public class MuleToJavaDSLDBSelectTest extends JavaDSLActionBaseTest { @Test public void translateDbSelectDynamicQuery() { diff --git a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLWmqTest.java b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/wmq/MuleToJavaDSLWmqTest.java similarity index 98% rename from components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLWmqTest.java rename to components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/wmq/MuleToJavaDSLWmqTest.java index 7bf200ab0..79f0fc722 100644 --- a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLWmqTest.java +++ b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/wmq/MuleToJavaDSLWmqTest.java @@ -14,11 +14,12 @@ * limitations under the License. */ -package org.springframework.sbm.mule.actions; +package org.springframework.sbm.mule.actions.wmq; import org.junit.jupiter.api.Test; import org.openrewrite.SourceFile; import org.springframework.sbm.build.api.Dependency; +import org.springframework.sbm.mule.actions.JavaDSLActionBaseTest; import org.springframework.sbm.project.resource.RewriteSourceFileHolder; import java.util.List;