docs: public Properties getProperties(String sslAliasName, Map<String, Object> connectionInfo, SSLConfigChangeListener listener, boolean tryDefault) throws SSLException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              Tr.entry(tc, "getProperties", new Object[] { sslAliasName, connectionInfo, listener });
  
          SecurityManager sm = System.getSecurityManager();
          if (sm != null) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Performing Java 2 Security Permission Check ...");
                  Tr.debug(tc, "Expecting : " + GET_SSLCONFIG.toString());
              }
              sm.checkPermission(GET_SSLCONFIG);
          }
  
          boolean isOutbound = true;
          if (SSLConfigManager.getInstance().isTransportSecurityEnabled()) {
              if (connectionInfo != null) {
                  String direction = (String) connectionInfo.get(Constants.CONNECTION_INFO_DIRECTION);
                  if (direction != null && direction.equals(Constants.DIRECTION_INBOUND))
                      isOutbound = false;
              }
          }
  
          try {
              // programmatic selection
              Properties programmaticProperties = getSSLPropertiesOnThread();
              if (programmaticProperties != null) {
                  // convert to SSLConfig for validation of customer properties
                  SSLConfig programmaticConfig = new SSLConfig(programmaticProperties);
  
                  if (listener != null) {
                      String alias = programmaticConfig.getProperty(Constants.SSLPROP_ALIAS);
                      if (alias == null)
                          alias = sslAliasName;
                      registerEvent(listener, alias, programmaticConfig, Constants.SELECTION_TYPE_THREAD, connectionInfo);
                  }
  
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      Tr.exit(tc, "getProperties -> programmatic");
                  return programmaticConfig;
              }
  
              // direct selection
              if (sslAliasName != null && sslAliasName.length() > 0) {
                  Properties directSelectionProperties = SSLConfigManager.getInstance().getProperties(sslAliasName);
  
                  if (directSelectionProperties == null) { // added for issue 876
                      String origAliasName = SSLConfigManager.getInstance().getPossibleActualID(sslAliasName);
                      if (origAliasName != null) {
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                              Tr.debug(tc, "could not find properties with " + sslAliasName + " trying properties with " + origAliasName);
                          directSelectionProperties = SSLConfigManager.getInstance().getProperties(origAliasName);
                      }
                  }
  
                  if (directSelectionProperties != null) {
                      directSelectionProperties = SSLConfigManager.getInstance().determineIfCSIv2SettingsApply(directSelectionProperties, connectionInfo);
  
                      if (listener != null)
                          registerEvent(listener, sslAliasName, directSelectionProperties, Constants.SELECTION_TYPE_DIRECT, connectionInfo);
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                          Tr.exit(tc, "getProperties -> direct");
                      return directSelectionProperties;
                  }
              }
  
              // dynamic selection
              if (SSLConfigManager.getInstance().isTransportSecurityEnabled() && isOutbound) {
                  SSLConfig dynamicSelectionConfig = (SSLConfig) SSLConfigManager.getInstance().getPropertiesFromDynamicSelectionInfo(connectionInfo);
                  if (dynamicSelectionConfig != null) {
  
                      if (listener != null) {
                          String alias = dynamicSelectionConfig.getProperty(Constants.SSLPROP_ALIAS);
                          if (alias == null)
                              alias = sslAliasName;
                          registerEvent(listener, alias, dynamicSelectionConfig, Constants.SELECTION_TYPE_DYNAMIC, connectionInfo);
                      }
  
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                          Tr.exit(tc, "getProperties -> dynamic");
                      return dynamicSelectionConfig;
                  }
              }
  
              if (tryDefault) {
                  if (SSLConfigManager.getInstance().isTransportSecurityEnabled() && isOutbound) {
                      Properties props = SSLConfigManager.getInstance().getOutboundDefaultSSLConfig();
                      if (props != null && !props.isEmpty()) {
                          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
                              Tr.exit(tc, "getProperties -> outbound default");
                          }
                          return props;
                      }
                  }
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
                      Tr.exit(tc, "getProperties -> default");
                  }
                  return SSLConfigManager.getInstance().getDefaultSSLConfig();
              } else {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
                      Tr.exit(tc, "getProperties -> null");
                  }
                  return null;
              }
          } catch (Exception e) {
              FFDCFilter.processException(e, getClass().getName(), "getProperties (2)", this);
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  Tr.exit(tc, "The following exception occurred in getProperties().", new Object[] { e });
              throw asSSLException(e);
          }
      }