docs: @Override
      public SSLContext getSSLContext(Map<String, Object> connectionInfo, SSLConfig sslConfig) throws Exception {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              Tr.entry(tc, "getSSLContext", new Object[] { connectionInfo });
  
          // first try to get the SSLContext from the cache.
          SSLContext sslContext = sslContextCacheJAVAX.get(sslConfig);
  
          setOutboundConnectionInfoInternal(connectionInfo);
  
          if (sslContext != null) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  Tr.exit(tc, "getSSLContext -> (from cache)");
              return sslContext;
          }
  
          // Create the SSL context needed by the JSSE.
          sslContext = getSSLContextInstance(sslConfig);
  
          List<KeyManager> keyMgrs = new ArrayList<KeyManager>();
          List<TrustManager> trustMgrs = new ArrayList<TrustManager>();
          getKeyTrustManagers(connectionInfo, sslConfig, keyMgrs, trustMgrs);
  
          if (!keyMgrs.isEmpty() && !trustMgrs.isEmpty()) {
              KeyManager[] keyManagers = keyMgrs.toArray(new KeyManager[keyMgrs.size()]);
              TrustManager[] trustManagers = trustMgrs.toArray(new TrustManager[trustMgrs.size()]);
              // use default SecureRandom
              sslContext.init(keyManagers, trustManagers, null);
          } else if (keyMgrs.isEmpty() && !trustMgrs.isEmpty()) {
              TrustManager[] trustManagers = trustMgrs.toArray(new TrustManager[trustMgrs.size()]);
              // use default SecureRandom
              sslContext.init(null, trustManagers, null);
          } else {
              throw new SSLException("Null trust and key managers.");
          }
  
          // this may need to be made configurable at some point.
          if (sslContextCacheJAVAX.size() > 100) {
              // instead of clearing the entry cache, grab a few to delete
              Iterator<SSLConfig> keys = sslContextCacheJAVAX.keySet().iterator();
              SSLConfig[] victims = new SSLConfig[] { keys.next(), keys.next(), keys.next(), keys.next(), keys.next() };
              // delete the victim entries after using the iterator (not while)
              for (SSLConfig victim : victims) {
                  sslContextCacheJAVAX.remove(victim);
              }
          }
  
          sslContextCacheJAVAX.put(sslConfig, sslContext);
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
              Tr.debug(tc, "SSLContext cache size: " + sslContextCacheJAVAX.size());
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              Tr.exit(tc, "getSSLContext -> (new)");
          return sslContext;
      }