diff --git a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/http/HttpRequestTranslator.java b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/http/HttpRequestTranslator.java index 356ed3d0f..d6df08c74 100644 --- a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/http/HttpRequestTranslator.java +++ b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/actions/javadsl/translators/http/HttpRequestTranslator.java @@ -15,12 +15,8 @@ */ package org.springframework.sbm.mule.actions.javadsl.translators.http; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; import org.mulesoft.schema.mule.http.RequestConfigType; import org.mulesoft.schema.mule.http.RequestType; -import org.springframework.beans.factory.annotation.Autowired; 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.ConfigurationTypeAdapter; @@ -28,13 +24,8 @@ import org.springframework.stereotype.Component; import javax.xml.namespace.QName; -import java.io.IOException; -import java.io.StringReader; -import java.io.StringWriter; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; + /** * Translator for {@code } elements.spring integration @@ -46,59 +37,61 @@ @Component public class HttpRequestTranslator implements MuleComponentToSpringIntegrationDslTranslator { - @Autowired - private Configuration configuration; - @Override public Class getSupportedMuleType() { return RequestType.class; } + private static final String template = " .headerFilter(\"accept-encoding\", false)\n" + + " .handle(\n" + + " Http.outboundGateway(\"$PROTOCOL://$HOST:$PORT$PATH\")\n" + + " .httpMethod(HttpMethod.$METHOD)\n" + + " //FIXME: Use appropriate response class type here instead of String.class\n" + + " .expectedResponseType(String.class)\n" + + " )"; + @Override public DslSnippet translate(RequestType component, QName name, MuleConfigurations muleConfigurations, String flowName) { + RequestConfigType config = getRequestConfiguration(component, muleConfigurations); + return new DslSnippet( + template + .replace("$PATH", emptyStringIfNull(component.getPath())) + .replace("$METHOD", defaultToValueIfNull(component.getMethod(), "GET")) + .replace("$HOST", emptyStringIfNull(config.getHost())) + .replace("$PORT", emptyStringIfNull(config.getPort())) + .replace("$PROTOCOL", defaultToValueIfNull(config.getProtocol(), "http").toLowerCase()) + , + Set.of("org.springframework.http.HttpMethod") + ); + } + + private RequestConfigType getRequestConfiguration(RequestType component, MuleConfigurations muleConfigurations) { + RequestConfigType emptyRequestConfig = new RequestConfigType(); + + ConfigurationTypeAdapter configurationTypeAdapter = + muleConfigurations.getConfigurations().get(component.getConfigRef()); - String templateStr = "return IntegrationFlows\n" + - " .from\n" + - " (\n" + - " Http.inboundChannelAdapter(\"${host}<#if port?has_content>:${port}/${basePath}\")\n" + - " .requestMapping(m -> m.methods(HttpMethod.GET))\n" + - "<#if responseTimeout?has_content>" + - " .replyTimeout(${responseTimeout})\n" + - "" + - " )\n" + - " .channel(INBOUND_DEMO_CHANNEL)\n" + - " .get();"; - - try { - Map data = new HashMap<>(); - - // TODO: requires access to config, e.g. muleMigrationContext.getConfigRef("...") - String configRef = component.getConfigRef(); - Optional configurationTypeAdapter = muleConfigurations.find(configRef); - if(configurationTypeAdapter.isPresent()) { - RequestConfigType cast = (RequestConfigType) configurationTypeAdapter.get().getMuleConfiguration(); - data.put("host", cast.getHost()); - data.put("port", cast.getPort()); - } - - - data.put("basePath", component.getPath()); - data.put("method", component.getMethod()); - data.put("responseTimeout", component.getResponseTimeout()); - Template t = new Template("name", new StringReader(templateStr), configuration); - StringWriter stringWriter = new StringWriter(); - t.process(data, - stringWriter); - return new DslSnippet(stringWriter.toString(), Collections.emptySet()); - } catch (IOException | TemplateException e) { - e.printStackTrace(); + if (configurationTypeAdapter == null) { + + return emptyRequestConfig; } + RequestConfigType requestConfig = configurationTypeAdapter + .getMuleConfiguration(); + + return requestConfig != null ? requestConfig : emptyRequestConfig; + } + + private String defaultToValueIfNull(String originalValue, String defaultValue) { + + return originalValue == null ? defaultValue : originalValue; + } - return null; + private String emptyStringIfNull(String value) { + return value == null ? "" : value; } } diff --git a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/api/toplevel/configuration/MuleConfigurationsExtractor.java b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/api/toplevel/configuration/MuleConfigurationsExtractor.java index ccc7e25f1..05aa1c3b7 100644 --- a/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/api/toplevel/configuration/MuleConfigurationsExtractor.java +++ b/components/sbm-recipes-mule-to-boot/src/main/java/org/springframework/sbm/mule/api/toplevel/configuration/MuleConfigurationsExtractor.java @@ -51,7 +51,11 @@ public Map> extractAllConfigurations(List aClass = jaxbElement.getValue().getClass(); - Set configTypes = Set.of(RequestConfigType.class, ConfigurationType.class, AbstractConnectorType.class, ListenerConfigType.class); + Set configTypes = Set.of(RequestConfigType.class, + ConfigurationType.class, + AbstractConnectorType.class, + ListenerConfigType.class + ); return configTypes.stream() .anyMatch(ct -> ct.isAssignableFrom(aClass)); } 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 7199037eb..64129402b 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 @@ -30,6 +30,8 @@ import org.springframework.sbm.mule.actions.javadsl.translators.dwl.DwlTransformTranslator; import org.springframework.sbm.mule.actions.javadsl.translators.http.HttpListenerConfigTypeAdapter; import org.springframework.sbm.mule.actions.javadsl.translators.http.HttpListenerTranslator; +import org.springframework.sbm.mule.actions.javadsl.translators.http.HttpRequestTranslator; +import org.springframework.sbm.mule.actions.javadsl.translators.http.RequestConfigTypeAdapter; import org.springframework.sbm.mule.actions.javadsl.translators.logging.LoggingTranslator; import org.springframework.sbm.mule.actions.javadsl.translators.wmq.WmqConnectorTypeAdapter; import org.springframework.sbm.mule.actions.javadsl.translators.wmq.WmqInboundEndpointTranslator; @@ -73,7 +75,8 @@ public void setup() { new TransformerTranslator(), new WmqOutboundEndpointTranslator(), new WmqInboundEndpointTranslator(), - new DwlTransformTranslator() + new DwlTransformTranslator(), + new HttpRequestTranslator() ); List topLevelTypeFactories = List.of( new FlowTopLevelElementFactory(translators), @@ -84,7 +87,8 @@ public void setup() { List.of( new AmqpConfigTypeAdapter(), new HttpListenerConfigTypeAdapter(), - new WmqConnectorTypeAdapter() + new WmqConnectorTypeAdapter(), + new RequestConfigTypeAdapter() ) ); MuleMigrationContextFactory muleMigrationContextFactory = new MuleMigrationContextFactory(new MuleConfigurationsExtractor(configurationTypeAdapterFactory)); diff --git a/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLHttpOutbound.java b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLHttpOutbound.java new file mode 100644 index 000000000..39d30e244 --- /dev/null +++ b/components/sbm-recipes-mule-to-boot/src/test/java/org/springframework/sbm/mule/actions/MuleToJavaDSLHttpOutbound.java @@ -0,0 +1,71 @@ +/* + * 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; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MuleToJavaDSLHttpOutbound extends JavaDSLActionBaseTest { + private static final String xml = "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + @Test + public void supportForHttpOutboundRequest() { + addXMLFileToResource(xml); + runAction(); + assertThat(projectContext.getProjectJavaSources().list()).hasSize(1); + assertThat(projectContext.getProjectJavaSources().list().get(0).print()) + .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.http.dsl.Http;\n" + + "\n" + + "@Configuration\n" + + "public class FlowConfigurations {\n" + + " @Bean\n" + + " IntegrationFlow httpFlow() {\n" + + " return IntegrationFlows.from(Http.inboundChannelAdapter(\"/gimme-a-cat-fact\")).handle((p, h) -> p)\n" + + " .headerFilter(\"accept-encoding\", false)\n" + + " .handle(\n" + + " Http.outboundGateway(\"https://catfact.ninja:443/fact\")\n" + + " .httpMethod(HttpMethod.GET)\n" + + " //FIXME: Use appropriate response class type here instead of String.class\n" + + " .expectedResponseType(String.class)\n" + + " )\n" + + " .handle((p, h) -> \"#[payload]\")\n" + + " .get();\n" + + " }}"); + } +}