`
sillycat
  • 浏览: 2488233 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

APACHE基于MINA的FTP SERVER(二)服务器初始化

    博客分类:
  • JAVA
阅读更多
APACHE基于MINA的FTP SERVER(二)服务器初始化

需要引入的JAR包
<dependency>
<groupId>org.apache.ftpserver</groupId>
<artifactId>ftpserver-core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>

web.xml配置启动时调用spring初始化
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
   org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

spring配置调用核心类FtpServerServiceImpl初始化FTP的SERVER池
<beans default-autowire="byName">
<bean name="ftpServerService" class="com.sillycat.easyftp.server.impl.FtpServerServiceImpl"
   init-method="init">
   <property name="configFile" value="${ftpserver.config.file}" />
</bean>
</beans>

单元测试中
public void testStop() {
FtpServerService ftpServerService = (FtpServerService) appContext.getBean("ftpServerService");
//停止名字为ftpsillycat的server
ftpServerService.stop("ftpsillycat");
}

服务器的初始化的核心类FtpServerServiceImpl.java,代码如下:
package com.sillycat.easyftp.server.impl;

import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import javax.xml.stream.XMLInputFactory;

import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.UserManager;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor;
import org.apache.ftpserver.usermanager.Md5PasswordEncryptor;
import org.apache.ftpserver.usermanager.PasswordEncryptor;
import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;
import org.apache.ftpserver.usermanager.SaltedPasswordEncryptor;
import org.apache.ftpserver.usermanager.impl.BaseUser;

import com.sillycat.easybase.base.BaseManager;
import com.sillycat.easybase.constants.FtpConstants;
import com.sillycat.easyftp.config.FtpServerConfig;
import com.sillycat.easyftp.config.UserServerConfig;
import com.sillycat.easyftp.server.FtpServerService;
import com.sillycat.easyftp.utils.XmlResourceUtil;

public class FtpServerServiceImpl extends BaseManager implements
   FtpServerService {
//ftp服务器的池
private ConcurrentHashMap<String, FtpServer> ftpServerPool;
//配置集合
private List<FtpServerConfig> ftpServerConfigs;
//读取的XML配置文件
private String configFile;
//启动服务器
public void start(String name) {
   FtpServer ftpServer = ftpServerPool.get(name);
   try {
    ftpServer.start();
   } catch (FtpException e) {
    e.printStackTrace();
   }
}
//停止服务器
public void stop(String name) {
   FtpServer ftpServer = ftpServerPool.get(name);
   ftpServer.stop();
}
//重启服务器
public void resume(String name) {
   FtpServer ftpServer = ftpServerPool.get(name);
   ftpServer.resume();
}
//暂停服务器
public void suspend(String name) {
   FtpServer ftpServer = ftpServerPool.get(name);
   ftpServer.suspend();
}

public void init() {
   // 初始化变量
   ftpServerPool = new ConcurrentHashMap<String, FtpServer>();
   ftpServerConfigs = new ArrayList<FtpServerConfig>();
   // 装在配置文件
   loadConfig();
   if (ftpServerConfigs != null && !ftpServerConfigs.isEmpty()) {
    initFtpServerPool();
   } else {
    logger.error("no config info for FtpServerServiceImpl!");
    throw new RuntimeException(
      "no config info for FtpServerServiceImpl!");
   }
}
//初始化FTP服务器池
public void initFtpServerPool() {
   for (int i = 0; i < ftpServerConfigs.size(); i++) {
    FtpServerConfig ftpServerConfig = ftpServerConfigs.get(i);
    this.addFtpServer(ftpServerConfig);
   }
   if(ftpServerPool != null && !ftpServerPool.isEmpty()){
    Iterator<String> itKey = ftpServerPool.keySet().iterator();
    for(;itKey.hasNext();){
     String key = itKey.next();
     FtpServer tmp = ftpServerPool.get(key);
     if(tmp != null){
      try {
       tmp.start();
       logger.info("ftp server " + key + " start!");
      } catch (FtpException e) {
       e.printStackTrace();
      }
     }
    }
   }
}

//读取配置文件
public void loadConfig() {
   URL url = null;
   ClassLoader loader = Thread.currentThread().getContextClassLoader();
   url = loader.getResource(this.getConfigFile());
   XMLInputFactory factory = XMLInputFactory.newInstance();
   if (url == null) {
    logger
      .error("no ftpserver config find! please put ftpserver.xml in your classpath");
    throw new java.lang.RuntimeException(
      "no ftpserver config find! please put ftpserver.xml in your classpath");
   }

   XmlResourceUtil.loadFtpServerConfigFromURL(url, factory,
     ftpServerConfigs);
   logger.info(new StringBuffer().append("load config from :").append(
     url.getFile()));
}

private void addFtpServer(FtpServerConfig ftpServerConfig) {
   FtpServerFactory ftpServerFactory = new FtpServerFactory();
   // 设置监听端口
   ListenerFactory linstenFactory = new ListenerFactory();
   linstenFactory.setPort(ftpServerConfig.getPort());
   ftpServerFactory
     .addListener("default", linstenFactory.createListener());

   // 密码加密类型
   PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
   PasswordEncryptor passwordEncryptor = null;
   if (FtpConstants.CLEAR_TEXT_FTP_PASSWORD_ENCRYPTOR
     .equalsIgnoreCase(ftpServerConfig.getPasswordEncryptor())) {
    passwordEncryptor = new ClearTextPasswordEncryptor();
   } else if (FtpConstants.SALTED_FTP_PASSWORD_ENCRYPTOR
     .equalsIgnoreCase(ftpServerConfig.getPasswordEncryptor())) {
    passwordEncryptor = new SaltedPasswordEncryptor();
   } else if (FtpConstants.MD5_FTP_PASSWORD_ENCRYPTOR
     .equalsIgnoreCase(ftpServerConfig.getPasswordEncryptor())) {
    passwordEncryptor = new Md5PasswordEncryptor();
   }
   userManagerFactory.setPasswordEncryptor(passwordEncryptor);
   // 用户
   UserManager um = userManagerFactory.createUserManager();
   if (ftpServerConfig.getUsers() != null
     && !ftpServerConfig.getUsers().isEmpty()) {
    for (int i = 0; i < ftpServerConfig.getUsers().size(); i++) {
     UserServerConfig tmp = ftpServerConfig.getUsers().get(i);
     addFtpUser(tmp, um);
    }
   }
   ftpServerFactory.setUserManager(um);
   FtpServer server = ftpServerFactory.createServer();
   ftpServerPool.put(ftpServerConfig.getName(), server);
}

private void addFtpUser(UserServerConfig userServerConfig, UserManager um) {
   BaseUser user = new BaseUser();
   user.setName(userServerConfig.getName());
   user.setPassword(userServerConfig.getPassword());
   user.setHomeDirectory(userServerConfig.getHomeDirectory());
   user.setEnabled(userServerConfig.getEnabled());
   user.setMaxIdleTime(userServerConfig.getMaxIdleTime());

   if (userServerConfig.getPermissions() != null
     && !userServerConfig.getPermissions().isEmpty()) {
    //权限
    user.setAuthorities(userServerConfig.getPermissions());
   }
   try {
    um.save(user);
   } catch (FtpException e) {
    e.printStackTrace();
   }
}

public String getConfigFile() {
   return configFile;
}

public void setConfigFile(String configFile) {
   this.configFile = configFile;
}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics