docs: public Properties getPropertiesFromDynamicSelectionInfo(Map<String, Object> connectionInfo) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              Tr.entry(tc, "getPropertiesFromDynamicSelectionInfo", new Object[] { connectionInfo });
  
          if (connectionInfo == null) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  Tr.debug(tc, "No connection information provided.");
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  Tr.exit(tc, "getPropertiesFromDynamicSelectionInfo");
              return null; // this allows it to move forward with other precedence.
          }
  
          if (dynamicSelections.isEmpty()) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  Tr.debug(tc, "There are no dynamic outbound selections configured.");
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  Tr.exit(tc, "getPropertiesFromDynamicSelectionInfo");
              return null;
          }
  
          /***
           * First look for a cached MISS in case it has already been looked
           * up from this particular connection info data.
           ***/
  
          synchronized (dynamicLookupMisses) {
              if (dynamicLookupMisses.contains(connectionInfo)) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                      Tr.debug(tc, "This connectionInfo was checked before, found in the lookup misses cache.");
                  if (tc.isEntryEnabled())
                      Tr.exit(tc, "getPropertiesFromDynamicSelectionInfo");
                  return null;
              }
          }
  
          /***
           * Next look for a cache HIT in case it has already been looked up from this
           * particular connection info data.
           ***/
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
              Tr.debug(tc, "Dynamic outbound lookup cache size is " + dynamicLookupCache.size());
          SSLConfig cachedConfig = dynamicLookupCache.get(connectionInfo);
  
          if (cachedConfig != null) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  Tr.debug(tc, "Found in cache.");
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  Tr.exit(tc, "getPropertiesFromDynamicSelectionInfo", cachedConfig);
              return cachedConfig;
          }
  
          String direction = (String) connectionInfo.get(Constants.CONNECTION_INFO_DIRECTION);
  
          if (direction != null && direction.equals(Constants.DIRECTION_INBOUND)) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  Tr.debug(tc, "Connection information is for an inbound connection return null.");
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  Tr.exit(tc, "getPropertiesFromDynamicSelectionInfo");
              return null;
          }
  
          String connInfoRemoteHost = (String) connectionInfo.get(Constants.CONNECTION_INFO_REMOTE_HOST);
          String connInfoRemotePort = (String) connectionInfo.get(Constants.CONNECTION_INFO_REMOTE_PORT);
          Tr.debug(tc, "Host from connectionInfo is " + connInfoRemoteHost + " and port from connectionInfo is " + connInfoRemotePort);
  
          /***
           * Look through all of the SSLConfigs in this list which all contain a
           * property with values for com.ibm.ssl.dynamicSelectionInfo.
           ***/
  
          if (connInfoRemoteHost != null) {
              SSLConfig sslCfg = lookForMatchInList(dynamicHostPortSelections, connInfoRemoteHost, connInfoRemotePort);
  
              if (sslCfg != null) {
                  dynamicLookupCache.put(connectionInfo, sslCfg);
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                      Tr.debug(tc, "Found in the host and port list.");
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      Tr.exit(tc, "getPropertiesFromDynamicSelectionInfo", sslCfg);
                  return sslCfg;
              }
  
              sslCfg = lookForMatchInList(dynamicHostSelections, connInfoRemoteHost, connInfoRemotePort);
              if (sslCfg != null) {
                  dynamicLookupCache.put(connectionInfo, sslCfg);
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                      Tr.debug(tc, "Found in the host list.");
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      Tr.exit(tc, "getPropertiesFromDynamicSelectionInfo", sslCfg);
                  return sslCfg;
              }
          }
  
          synchronized (dynamicLookupMisses) {
              if (dynamicLookupMisses.size() > 50) {
                  if (tc.isDebugEnabled())
                      Tr.debug(tc, "Cache miss tree set size is > 50, clearing the TreeSet.");
                  dynamicLookupMisses.clear();
              }
              dynamicLookupMisses.add(connectionInfo);
              if (tc.isDebugEnabled())
                  Tr.debug(tc, "Cache miss tree set size is " + dynamicLookupMisses.size() + " entries.");
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
              Tr.debug(tc, "No match found in host or host and port list.");
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              Tr.exit(tc, "getPropertiesFromDynamicSelectionInfo");
          return null;
      }