public SmartClientConnectionManager(
      HazelcastClient client, Authenticator authenticator, LoadBalancer loadBalancer) {
    this.authenticator = authenticator;
    this.client = client;
    ClientConfig config = client.getClientConfig();
    router = new Router(loadBalancer);

    // init socketInterceptor
    SocketInterceptorConfig sic = config.getSocketInterceptorConfig();
    if (sic != null && sic.isEnabled()) {
      SocketInterceptor implementation = (SocketInterceptor) sic.getImplementation();
      if (implementation == null && sic.getClassName() != null) {
        try {
          implementation = (SocketInterceptor) Class.forName(sic.getClassName()).newInstance();
        } catch (Throwable e) {
          logger.severe("SocketInterceptor class cannot be instantiated!" + sic.getClassName(), e);
        }
      }
      if (implementation != null) {
        if (!(implementation instanceof MemberSocketInterceptor)) {
          logger.severe(
              "SocketInterceptor must be instance of " + MemberSocketInterceptor.class.getName());
          implementation = null;
        } else {
          logger.info("SocketInterceptor is enabled");
        }
      }
      if (implementation != null) {
        socketInterceptor = implementation;
        socketInterceptor.init(sic.getProperties());
      } else {
        socketInterceptor = null;
      }
    } else {
      socketInterceptor = null;
    }

    poolSize = config.getConnectionPoolSize();
    int connectionTimeout = config.getConnectionTimeout();
    heartbeat =
        new HeartBeatChecker(
            connectionTimeout,
            client.getSerializationService(),
            client.getClientExecutionService());
    socketOptions = config.getSocketOptions();
  }
  private SocketInterceptor initSocketInterceptor(SocketInterceptorConfig sic) {
    SocketInterceptor implementation = null;
    if (sic != null && sic.isEnabled()) {
      implementation = (SocketInterceptor) sic.getImplementation();
      if (implementation == null && sic.getClassName() != null) {
        try {
          implementation = (SocketInterceptor) Class.forName(sic.getClassName()).newInstance();
        } catch (Throwable e) {
          LOGGER.severe("SocketInterceptor class cannot be instantiated!" + sic.getClassName(), e);
        }
      }
    }

    if (implementation != null) {
      implementation.init(sic.getProperties());
    }
    return implementation;
  }