package org.jfox.ejb.invoker.jrmp_ssl;

import java.rmi.server.RMIServerSocketFactory;
import java.net.ServerSocket;
import java.io.IOException;
import java.io.Serializable;
import java.security.KeyStore;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;

import org.huihoo.jfox.logging.Logger;

/**
 * @author <a href="mailto:yangyong@ufsoft.com.cn">Young Yang</a>
 */

public class RMISSLServerSocketFactory implements RMIServerSocketFactory, Serializable {
  private String SSLKeyFile = "jfox.keystore";
  private String password = "jfox.org";

  public RMISSLServerSocketFactory(String SSLKeyFile, String password) {
    this.SSLKeyFile = SSLKeyFile;
    this.password = password;
  }

  public ServerSocket createServerSocket(int port) throws IOException {
    try {
      KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
      keyStore.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(SSLKeyFile), password.toCharArray());
      KeyManagerFactory keyMgr = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
      keyMgr.init(keyStore, password.toCharArray());

//      TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
//      tmf.init(keyStore);

      SSLContext sslCtx = SSLContext.getInstance("TLS");
      sslCtx.init(keyMgr.getKeyManagers(), null, null);
      return sslCtx.getServerSocketFactory().createServerSocket(port);
    }
    catch (Exception e) {
      Logger.getLogger(this.getClass().getName()).error("can not initializing SSLContext", e);
      return null;
    }
  }

  public static void main(String[] args) {

  }
}