Package org.springframework.xd.shell.util

Source Code of org.springframework.xd.shell.util.TestFtpServer$TestUserManager

/*
* Copyright 2014 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.xd.shell.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.Authentication;
import org.apache.ftpserver.ftplet.AuthenticationFailedException;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.User;
import org.apache.ftpserver.ftplet.UserManager;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.usermanager.impl.BaseUser;
import org.apache.ftpserver.usermanager.impl.ConcurrentLoginPermission;
import org.apache.ftpserver.usermanager.impl.TransferRatePermission;
import org.apache.ftpserver.usermanager.impl.WritePermission;
import org.junit.rules.TemporaryFolder;

import org.springframework.context.annotation.Bean;
import org.springframework.integration.ftp.session.DefaultFtpSessionFactory;
import org.springframework.integration.test.util.SocketUtils;

/**
* Embedded FTP Server for test cases; exposes an associated session factory as a @Bean.
*
* @author Artem Bilan
* @author Gary Russell
* @since 3.0
*/
// @Configuration
public class TestFtpServer {

  private final int ftpPort = SocketUtils.findAvailableServerSocket();

  private final TemporaryFolder ftpFolder;

  private final TemporaryFolder localFolder;

  private volatile File ftpRootFolder;

  private volatile File sourceFtpDirectory;

  private volatile File targetFtpDirectory;

  private volatile File sourceLocalDirectory;

  private volatile File targetLocalDirectory;

  private volatile FtpServer server;

  public TestFtpServer(final String root) {
    this.ftpFolder = new TemporaryFolder() {

      @Override
      public void create() throws IOException {
        super.create();
        ftpRootFolder = this.newFolder(root);
        sourceFtpDirectory = new File(ftpRootFolder, "ftpSource");
        sourceFtpDirectory.mkdir();
        File file = new File(sourceFtpDirectory, "ftpSource1.txt");
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        fos.write("source1".getBytes());
        fos.close();
        file = new File(sourceFtpDirectory, "ftpSource2.txt");
        file.createNewFile();
        fos = new FileOutputStream(file);
        fos.write("source2".getBytes());
        fos.close();

        File subSourceFtpDirectory = new File(sourceFtpDirectory, "subFtpSource");
        subSourceFtpDirectory.mkdir();
        file = new File(subSourceFtpDirectory, "subFtpSource1.txt");
        file.createNewFile();
        fos = new FileOutputStream(file);
        fos.write("subSource1".getBytes());
        fos.close();

        targetFtpDirectory = new File(ftpRootFolder, "ftpTarget");
        targetFtpDirectory.mkdir();
      }
    };
    this.localFolder = new TemporaryFolder() {

      @Override
      public void create() throws IOException {
        super.create();
        File rootFolder = this.newFolder(root);
        sourceLocalDirectory = new File(rootFolder, "localSource");
        sourceLocalDirectory.mkdirs();
        File file = new File(sourceLocalDirectory, "localSource1.txt");
        file.createNewFile();
        file = new File(sourceLocalDirectory, "localSource2.txt");
        file.createNewFile();

        File subSourceLocalDirectory = new File(sourceLocalDirectory, "subLocalSource");
        subSourceLocalDirectory.mkdir();
        file = new File(subSourceLocalDirectory, "subLocalSource1.txt");
        file.createNewFile();

        targetLocalDirectory = new File(rootFolder, "localTarget");
        targetLocalDirectory.mkdir();
      }
    };
  }

  public int getPort() {
    return this.ftpPort;
  }

  public File getSourceFtpDirectory() {
    return sourceFtpDirectory;
  }

  public File getTargetFtpDirectory() {
    return targetFtpDirectory;
  }

  public File getSourceLocalDirectory() {
    return sourceLocalDirectory;
  }

  public File getTargetLocalDirectory() {
    return targetLocalDirectory;
  }

  public String getTargetLocalDirectoryName() {
    return targetLocalDirectory.getAbsolutePath() + File.separator;
  }

  @Bean
  public DefaultFtpSessionFactory ftpSessionFactory() {
    DefaultFtpSessionFactory factory = new DefaultFtpSessionFactory();
    factory.setHost("localhost");
    factory.setPort(this.ftpPort);
    factory.setUsername("foo");
    factory.setPassword("foo");
    return factory;
  }

  @PostConstruct
  public void before() throws Throwable {
    this.ftpFolder.create();
    this.localFolder.create();

    FtpServerFactory serverFactory = new FtpServerFactory();
    serverFactory.setUserManager(new TestUserManager(this.ftpRootFolder.getAbsolutePath()));

    ListenerFactory factory = new ListenerFactory();
    factory.setPort(ftpPort);
    serverFactory.addListener("default", factory.createListener());

    server = serverFactory.createServer();
    server.start();
  }


  @PreDestroy
  public void after() {
    this.server.stop();
    this.ftpFolder.delete();
    this.localFolder.delete();
  }


  public void recursiveDelete(File file) {
    File[] files = file.listFiles();
    if (files != null) {
      for (File each : files) {
        recursiveDelete(each);
      }
    }
    if (!(file.equals(this.targetFtpDirectory) || file.equals(this.targetLocalDirectory))) {
      file.delete();
    }
  }


  private class TestUserManager implements UserManager {

    private final BaseUser testUser;

    private TestUserManager(String homeDirectory) {
      this.testUser = new BaseUser();
      this.testUser.setAuthorities(Arrays.asList(new ConcurrentLoginPermission(1024, 1024),
          new WritePermission(),
          new TransferRatePermission(1024, 1024)));
      this.testUser.setHomeDirectory(homeDirectory);
      this.testUser.setName("TEST_USER");
    }


    @Override
    public User getUserByName(String s) throws FtpException {
      return this.testUser;
    }

    @Override
    public String[] getAllUserNames() throws FtpException {
      return new String[] { "TEST_USER" };
    }

    @Override
    public void delete(String s) throws FtpException {
    }

    @Override
    public void save(User user) throws FtpException {
    }

    @Override
    public boolean doesExist(String s) throws FtpException {
      return true;
    }

    @Override
    public User authenticate(Authentication authentication) throws AuthenticationFailedException {
      return this.testUser;
    }

    @Override
    public String getAdminName() throws FtpException {
      return "admin";
    }

    @Override
    public boolean isAdmin(String s) throws FtpException {
      return s.equals("admin");
    }

  }

}
TOP

Related Classes of org.springframework.xd.shell.util.TestFtpServer$TestUserManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.