* Copyright (c) The openTCS Authors.
 * This program is free software and subject to the MIT license. (For details,
 * see the licensing information (LICENSE.txt) you should have received with
 * this copy of the software.)
package org.opentcs.access.rmi.factories;

import java.io.IOException;
import java.io.Serializable;
import java.net.Socket;
import java.rmi.server.RMIClientSocketFactory;
import static java.util.Objects.requireNonNull;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.rmi.ssl.SslRMIClientSocketFactory;

 * This implementation is similar to {@link SslRMIClientSocketFactory} but allows the use of a
 * custom SSLConext.
 * @author Leonard Schuengel (Fraunhofer IML)
class CustomSslRMIClientSocketFactory
    implements RMIClientSocketFactory,
               Serializable {

   * Provides an instance of {@link SSLContext} used to get the actual socket factory.
  private final SecureSslContextFactory secureSslContextFactory;

   * Creates a new instance.
   * @param secureSslContextFactory Provides an instance of {@link SSLContext} used to get the
   * actual socket factory.
  public CustomSslRMIClientSocketFactory(SecureSslContextFactory secureSslContextFactory) {
    this.secureSslContextFactory = requireNonNull(secureSslContextFactory,

  public Socket createSocket(String host, int port)
      throws IOException {
    SSLContext context = secureSslContextFactory.createClientContext();
    SSLSocketFactory sf = context.getSocketFactory();
    SSLSocket socket = (SSLSocket) sf.createSocket(host, port);
    SSLParameters param = context.getSupportedSSLParameters();
    return socket;