Skip to content

Commit 3833ab8

Browse files
committed
feat: S3OutboundGatewayParser
1 parent 69ee734 commit 3833ab8

File tree

5 files changed

+93
-4
lines changed

5 files changed

+93
-4
lines changed

int-aws/src/main/java/org/springframework/integration/aws/config/xml/parsers/S3MessageHandlerParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public XmlBeanDefinitionBuilder parse(Element element, ParserContext parserConte
2020
.addExclusiveConstructorArgValue("bucket", "bucket-expression", ValueFactory.typedString(), ValueFactory.expressionBean())
2121
.configure(def -> def.addConstructorArgValue(produceReply))
2222
.setPropertyIfAttributeDefined("async")
23-
.setPropertyIfAttributeDefined("send-timeout")
24-
.setPropertyIfAttributeDefined("output-channel", "outputChannelName")
23+
.setPropertyIfAttributeDefined("reply-channel", "outputChannelName")
24+
.setPropertyIfAttributeDefined("reply-timeout", "sendTimeout")
2525
.setPropertyOrExpressionIfAttributeDefined("key")
2626
.setPropertyOrExpressionIfAttributeDefined("destination-bucket")
2727
.setPropertyOrExpressionIfAttributeDefined("destination-key")
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.springframework.integration.aws.config.xml.parsers;
2+
3+
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
4+
import org.springframework.beans.factory.xml.ParserContext;
5+
import org.springframework.integration.config.xml.AbstractConsumerEndpointParser;
6+
import org.w3c.dom.Element;
7+
8+
public class S3OutboundGatewayParser extends AbstractConsumerEndpointParser {
9+
10+
@Override
11+
protected String getInputChannelAttributeName() {
12+
return "request-channel";
13+
}
14+
15+
@Override
16+
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
17+
return new S3MessageHandlerParser(true)
18+
.parse(element, parserContext)
19+
.getBeanDefinitionBuilder()
20+
;
21+
}
22+
}

int-aws/src/main/resources/org/springframework/integration/aws/config/xml/element-parser.mapping

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
s3-inbound-channel-adapter: org.springframework.integration.aws.config.xml.parsers.S3InboundChannelAdapterParser
22
s3-inbound-streaming-channel-adapter: org.springframework.integration.aws.config.xml.parsers.S3InboundStreamingChannelAdapterParser
33
s3-outbound-channel-adapter: org.springframework.integration.aws.config.xml.parsers.S3OutboundChannelAdapterParser
4-
s3-outbound-gateway: org.springframework.integration.aws.support.config.xml.parsers.S3OutboundGatewayParser
4+
s3-outbound-gateway: org.springframework.integration.aws.config.xml.parsers.S3OutboundGatewayParser
55
kcl-message-driven-channel-adapter: org.springframework.integration.aws.config.xml.parsers.KclMessageDrivenChannelAdapterParser
66
kinesis-message-driven-channel-adapter: org.springframework.integration.aws.config.xml.parsers.KinesisMessageDrivenChannelAdapterParser
77
kinesis-outbound-channel-adapter: org.springframework.integration.aws.config.xml.parsers.KinesisOutboundChannelAdapterParser

int-aws/src/test/java/org/springframework/integration/aws/config/xml/SpringIntegrationAwsNamespaceHandlerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
import org.springframework.integration.aws.config.xml.parsers.S3InboundChannelAdapterParser;
1111
import org.springframework.integration.aws.config.xml.parsers.S3InboundStreamingChannelAdapterParser;
1212
import org.springframework.integration.aws.config.xml.parsers.S3OutboundChannelAdapterParser;
13+
import org.springframework.integration.aws.config.xml.parsers.S3OutboundGatewayParser;
1314
import org.springframework.integration.aws.config.xml.parsers.SqsMessageDrivenChannelAdapterParser;
1415
import org.springframework.integration.aws.config.xml.parsers.SqsOutboundChannelAdapterParser;
15-
import org.springframework.integration.aws.support.config.xml.parsers.S3OutboundGatewayParser;
1616
import org.springframework.integration.aws.support.config.xml.parsers.SnsInboundChannelAdapterParser;
1717
import org.springframework.integration.aws.support.config.xml.parsers.SnsOutboundChannelAdapterParser;
1818

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package org.springframework.integration.aws.config.xml.parsers;
2+
3+
import org.bool.junit.mockito.inline.ConstructionMock;
4+
5+
import org.assertj.core.api.InstanceOfAssertFactories;
6+
import org.junit.jupiter.api.Test;
7+
import org.mockito.Mock;
8+
import org.mockito.MockedConstruction.Context;
9+
import org.springframework.integration.aws.outbound.S3MessageHandler;
10+
import org.springframework.integration.aws.outbound.S3MessageHandler.Command;
11+
import org.springframework.integration.channel.DirectChannel;
12+
import org.springframework.messaging.Message;
13+
import software.amazon.awssdk.services.s3.S3AsyncClient;
14+
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
15+
16+
import java.util.function.BiConsumer;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
20+
public class S3OutboundGatewayParserTest extends ParserTestBase {
21+
22+
@Mock
23+
private S3AsyncClient s3Client;
24+
25+
@Mock
26+
private BiConsumer<PutObjectRequest.Builder, Message<?>> uploadMetadataProvider;
27+
28+
@ConstructionMock(S3MessageHandler.class)
29+
@Test
30+
void testMessageHandler() {
31+
registerBean("sss", S3AsyncClient.class, s3Client);
32+
registerBean("ump", BiConsumer.class, uploadMetadataProvider);
33+
registerBean("rq", DirectChannel.class, new DirectChannel());
34+
35+
var handler = loadBean(S3MessageHandler.class, """
36+
<int-aws:s3-outbound-gateway
37+
id="s3gw"
38+
s3="sss"
39+
async="#{true}"
40+
bucket="#{'bkt'}"
41+
command="#{'COPY'}"
42+
key-expression="key.exp"
43+
destination-key-expression="dest.key.exp"
44+
destination-bucket-expression="dest.bkt.exp"
45+
order="#{5}"
46+
request-channel="rq"
47+
reply-channel="rpl"
48+
reply-timeout="#{50}"
49+
upload-metadata-provider="ump"/>
50+
""");
51+
52+
verify(handler).setAsync(true);
53+
verify(handler).setCommand(Command.COPY);
54+
verify(handler).setKeyExpression(argThat(e -> e.getExpressionString().equals("key.exp")));
55+
verify(handler).setDestinationKeyExpression(argThat(e -> e.getExpressionString().equals("dest.key.exp")));
56+
verify(handler).setDestinationBucketExpression(argThat(e -> e.getExpressionString().equals("dest.bkt.exp")));
57+
verify(handler).setOrder(5);
58+
verify(handler).setSendTimeout(50L);
59+
verify(handler).setOutputChannelName("rpl");
60+
verify(handler).setUploadMetadataProvider(uploadMetadataProvider);
61+
}
62+
63+
void testMessageHandler(S3MessageHandler mock, Context context) {
64+
assertThat(context.arguments()).asInstanceOf(InstanceOfAssertFactories.LIST)
65+
.contains(s3Client, "bkt", true);
66+
}
67+
}

0 commit comments

Comments
 (0)