docs: public static SSLSocketFactory getSSLSocketFactoryBySSLRef(String sslRef, Map<String, Object> props, boolean fallbackOnDefault) {
          SSLSupport sslSupportService = tryGetSSLSupport();
  
          if (null == sslSupportService) {
              return null;
          }
  
          JSSEHelper jsseHelper = sslSupportService.getJSSEHelper();
          Properties sslConfig = null;
          SSLConfig sslConfigCopy = null;
          try {
              sslConfig = jsseHelper.getProperties(sslRef);
              if (null != sslConfig) {
                  // must copy one
                  sslConfigCopy = new SSLConfig(sslConfig);
              } else {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Cannot get the ssl configuration by sslRef=" + sslRef);
                  }
  
                  if (fallbackOnDefault) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Try to get the default ssl configuration of server");
                      }
                      // maybe use something like: <sslDefault sslRef="myDefaultSSLConfig">
                      sslConfig = jsseHelper.getProperties(null, null, null);
                      if (null != sslConfig) {
                          sslConfigCopy = new SSLConfig(sslConfig);
                      }
                  }
              }
  
              if (null == sslConfigCopy) {
                  return null;
              }
              // override the existed property in SSLConfig
              if (null != props && !props.isEmpty()) {
                  Iterator<Map.Entry<String, Object>> iter = props.entrySet().iterator();
                  while (iter.hasNext()) {
                      Map.Entry<String, Object> entry = iter.next();
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, entry.getKey() + "=" + entry.getValue() + " is overriden in SSLConfig=" + sslRef);
                      }
                      sslConfigCopy.put(entry.getKey(), entry.getValue());
                  }
              }
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Get the SSLSocketFactory by sslRef=" + sslRef);
              }
  
              return sslSupportService.getJSSEProvider().getSSLSocketFactory(null, sslConfigCopy);
          } catch (SSLException e) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "err.when.get.ssl.config", sslRef);
              }
              throw new IllegalArgumentException(e);
          } catch (Exception e) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "err.when.get.ssl.socket.factory", sslRef);
              }
              throw new IllegalStateException(e);
          }
      }