org.springframework.integration.ftp.inbound.FtpStreamingMessageSourceTests.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.integration.ftp.inbound.FtpStreamingMessageSourceTests.java

Source

/*
 * Copyright 2016-2017 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
 *
 *      http://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.integration.ftp.inbound;

import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;

import java.io.InputStream;
import java.util.Comparator;

import org.apache.commons.net.ftp.FTPFile;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.InboundChannelAdapter;
import org.springframework.integration.annotation.Transformer;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.core.MessageSource;
import org.springframework.integration.endpoint.SourcePollingChannelAdapter;
import org.springframework.integration.file.FileHeaders;
import org.springframework.integration.file.filters.AcceptAllFileListFilter;
import org.springframework.integration.file.remote.FileInfo;
import org.springframework.integration.file.remote.session.SessionFactory;
import org.springframework.integration.ftp.FtpTestSupport;
import org.springframework.integration.ftp.session.FtpFileInfo;
import org.springframework.integration.ftp.session.FtpRemoteFileTemplate;
import org.springframework.integration.scheduling.PollerMetadata;
import org.springframework.integration.transformer.StreamTransformer;
import org.springframework.messaging.Message;
import org.springframework.scheduling.support.PeriodicTrigger;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author Gary Russell
 * @author Artem Bilan
 * @since 4.3
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext
public class FtpStreamingMessageSourceTests extends FtpTestSupport {

    @Autowired
    private QueueChannel data;

    @Autowired
    private FtpStreamingMessageSource source;

    @Autowired
    private SourcePollingChannelAdapter adapter;

    @SuppressWarnings("unchecked")
    @Test
    public void testAllContents() {
        Message<byte[]> received = (Message<byte[]>) this.data.receive(10000);
        assertNotNull(received);
        assertThat(new String(received.getPayload()), equalTo("source1"));
        String fileInfo = (String) received.getHeaders().get(FileHeaders.REMOTE_FILE_INFO);
        assertThat(fileInfo, containsString("remoteDirectory\":\"ftpSource"));
        assertThat(fileInfo, containsString("permissions\":\"-rw-------"));
        assertThat(fileInfo, containsString("size\":7"));
        assertThat(fileInfo, containsString("directory\":false"));
        assertThat(fileInfo, containsString("filename\":\" ftpSource1.txt"));
        assertThat(fileInfo, containsString("modified\":"));
        assertThat(fileInfo, containsString("link\":false"));
        received = (Message<byte[]>) this.data.receive(10000);
        assertNotNull(received);
        assertThat(new String(received.getPayload()), equalTo("source2"));
        fileInfo = (String) received.getHeaders().get(FileHeaders.REMOTE_FILE_INFO);
        assertThat(fileInfo, containsString("remoteDirectory\":\"ftpSource"));
        assertThat(fileInfo, containsString("permissions\":\"-rw-------"));
        assertThat(fileInfo, containsString("size\":7"));
        assertThat(fileInfo, containsString("directory\":false"));
        assertThat(fileInfo, containsString("filename\":\"ftpSource2.txt"));
        assertThat(fileInfo, containsString("modified\":"));
        assertThat(fileInfo, containsString("link\":false"));

        this.adapter.stop();
        this.source.setFileInfoJson(false);
        this.data.purge(null);
        this.adapter.start();
        received = (Message<byte[]>) this.data.receive(10000);
        assertNotNull(received);
        assertThat(received.getHeaders().get(FileHeaders.REMOTE_FILE_INFO), instanceOf(FtpFileInfo.class));
        this.adapter.stop();
    }

    @Configuration
    @EnableIntegration
    public static class Config {

        @Bean
        public QueueChannel data() {
            return new QueueChannel();
        }

        @Bean(name = PollerMetadata.DEFAULT_POLLER)
        public PollerMetadata defaultPoller() {
            PollerMetadata pollerMetadata = new PollerMetadata();
            pollerMetadata.setTrigger(new PeriodicTrigger(500));
            pollerMetadata.setMaxMessagesPerPoll(2000);
            return pollerMetadata;
        }

        @Bean
        @InboundChannelAdapter(channel = "stream")
        public MessageSource<InputStream> ftpMessageSource() {
            FtpStreamingMessageSource messageSource = new FtpStreamingMessageSource(template(),
                    Comparator.comparing(FileInfo::getFilename));
            messageSource.setFilter(new AcceptAllFileListFilter<>());
            messageSource.setRemoteDirectory("ftpSource/");
            return messageSource;
        }

        @Bean
        @Transformer(inputChannel = "stream", outputChannel = "data")
        public org.springframework.integration.transformer.Transformer transformer() {
            return new StreamTransformer();
        }

        @Bean
        public FtpRemoteFileTemplate template() {
            return new FtpRemoteFileTemplate(ftpSessionFactory());
        }

        @Bean
        public SessionFactory<FTPFile> ftpSessionFactory() {
            return FtpStreamingMessageSourceTests.sessionFactory();
        }

    }

}