docs: @Override
      public java.net.Socket createSocket() throws IOException {
          // This is the code to support outbound ssl config for an unconnected socket.
          // To make this code work, the caller side needs to set either sslProperties by using setSSLPropertiesOnThread
          // or outbound connection info with host/port information by using setOutboundConnectionInfo.
          // Either case, the thread attached information needs to be cleared after creating a socket.
          if (tc.isEntryEnabled())
              Tr.entry(tc, "createSocket");
          javax.net.ssl.SSLSocketFactory currentFactory = default_factory;
          javax.net.ssl.SSLSocket socket = null;
          java.util.Properties sslProps = props;
          if (default_constructor) {
              try {
                  java.util.Properties sslPropsOnThread = getSSLPropertiesOnThread();
                  java.util.Map<String, Object> currentConnectionInfo = JSSEHelper.getInstance().getOutboundConnectionInfo();
                  if ((sslPropsOnThread != null) || (currentConnectionInfo != null)) {
                      if (tc.isDebugEnabled())
                          Tr.debug(tc, "either SSLProperties on thread or connectionInfo is available.");
                      if (currentConnectionInfo == null) {
                          currentConnectionInfo = new HashMap<String, Object>();
                          currentConnectionInfo.put(Constants.CONNECTION_INFO_DIRECTION, Constants.DIRECTION_OUTBOUND);
                      }
                      sslProps = getProperties(null, currentConnectionInfo, null);
                      if (tc.isDebugEnabled())
                          Tr.debug(tc, "Getting SSLSocketFactory");
                      currentFactory = getSSLSocketFactory(currentConnectionInfo, sslProps);
                      if (tc.isDebugEnabled())
                          Tr.debug(tc, "Got SSLSocketFactory", new Object[] { currentFactory });
                  } else {
                      if (tc.isDebugEnabled())
                          Tr.debug(tc, "Neither SSLProperties nor outboundConnectionInfo is set and this is an unconnected socket so create a WSSocket.");
                      java.net.Socket ws_socket = (Socket) AccessController.doPrivileged(new PrivilegedAction<Object>() {
                          @Override
                          public Object run() {
  
                              return (new com.ibm.ws.ssl.config.WSSocket(new java.net.Socket()));
                          }
                      });
                      if (tc.isEntryEnabled())
                          Tr.exit(tc, "createSocket");
                      return ws_socket;
                  }
  
              } catch (Exception e) {
                  if (tc.isDebugEnabled())
                      Tr.debug(tc, "Exception getting SSLSocketFactory. Fall back to the default SSLSocketFactory", new Object[] { e });
                  FFDCFilter.processException(e, getClass().getName(), "createSocket", this);
                  currentFactory = default_factory;
              }
          } else {
              if (tc.isDebugEnabled())
                  Tr.debug(tc, "Use default SSLSocketFactory - the default constructor was not used");
          }
          if (currentFactory != null) {
              socket = (javax.net.ssl.SSLSocket) currentFactory.createSocket();
              socket = SSLConfigManager.getInstance().setCipherListOnSocket(sslProps, socket);
          } else
              throw new javax.net.ssl.SSLException("SSLSocketFactory is null. This can occur if javax.net.ssl.SSLSocketFactory.getDefault() is called to create a socket and javax.net.ssl.* properties are not set.");
  
          if (tc.isEntryEnabled())
              Tr.exit(tc, "createSocket");
          return socket;
      }