docs: private void initializeContextManager(Map<String, Object> configProps) throws WIMException {
  
          iContextManager = new ContextManager();
  
          /*
           * Set SSL configuration
           */
          iContextManager.setSSLAlias((String) configProps.get("sslRef"));
          iContextManager.setSSLEnabled((Boolean) configProps.get(CONFIG_PROP_SSL_ENABLED));
  
          /*
           * Set the primary server.
           */
          iContextManager.setPrimaryServer((String) configProps.get(CONFIG_PROP_HOST), (Integer) configProps.get(CONFIG_PROP_PORT));
  
          /*
           * Set fail-over servers and fail-over behavior.
           */
          for (Map<String, Object> serverConfig : Nester.nest(FAILOVER_SERVERS, configProps)) {
              List<Map<String, Object>> servers = Nester.nest(SERVER2, serverConfig);
              for (Map<String, Object> server : servers) {
                  iContextManager.addFailoverServer((String) server.get(CONFIG_PROP_HOST), (Integer) server.get(CONFIG_PROP_PORT));
              }
          }
          iContextManager.setWriteToSecondary(Boolean.getBoolean((String) configProps.get(CONFIG_PROP_ALLOW_WRITE_TO_SECONDARY_SERVERS)));
          iContextManager.setReturnToPrimary((Boolean) configProps.get(CONFIG_PROP_RETURN_TO_PRIMARY_SERVER));
          iContextManager.setQueryInterval((Integer) configProps.get(CONFIG_PROP_PRIMARY_SERVER_QUERY_TIME_INTERVAL) * 60);
  
          /*
           * Set the simple authentication credentials.
           */
          iContextManager.setSimpleCredentials((String) configProps.get(CONFIG_PROP_BIND_DN), (SerializableProtectedString) configProps.get(CONFIG_PROP_BIND_PASSWORD));
  
          /*
           * Set the connection timeout.
           */
          iContextManager.setConnectTimeout((Long) configProps.get(CONFIG_PROP_CONNECT_TIMEOUT));
  
          /*
           * Set the connection timeout.
           */
          iContextManager.setReadTimeout((Long) configProps.get(CONFIG_PROP_READ_TIMEOUT));
  
          /*
           * Determine referral handling behavior. Initially the attribute was spelled missing an 'r' so
           * for backwards compatibility, support customers who might still be using it. The "referal"
           * attribute has no default so unless it is set we won't use it.
           */
          String referal = (String) configProps.get(CONFIG_PROP_REFERAL);
          String referral = (String) configProps.get(CONFIG_PROP_REFERRAL);
          referral = referal != null ? referal : referral;
          iContextManager.setReferral(referral.toLowerCase());
  
          /*
           * Set binary attribute names.
           */
          iContextManager.setBinaryAttributeNames(getBinaryAttributes());
  
          /*
           * Configure the context pool.
           */
          boolean enableContextPool = true;
  
          List<Map<String, Object>> poolConfigs = Nester.nest(CONFIG_CONTEXT_POOL, configProps);
  
          Map<String, Object> poolConfig = null;
          if (!poolConfigs.isEmpty()) {
              poolConfig = poolConfigs.get(0);
          }
  
          /*
           * Enable the context pool if the context pool is enabled and the
           * stand-alone LDAP property reuseConnection has not been set to false.
           */
          boolean reuseConn = (Boolean) configProps.get(CONFIG_REUSE_CONNECTION);
          if (tc.isDebugEnabled()) {
              Tr.debug(tc, "Set reuseConnection as [" + reuseConn + "]");
          }
          if (poolConfig != null) {
              enableContextPool = (Boolean) poolConfig.get(CONFIG_PROP_ENABLED);
          }
          if (!reuseConn) {
              enableContextPool = false;
          }
  
          Integer initPoolSize = null;
          Integer maxPoolSize = null;
          Integer prefPoolSize = null;
          Long poolTimeOut = null;
          Long poolWaitTime = null;
  
          if (enableContextPool) {
              if (poolConfig != null) {
                  if (poolConfig.get(CONFIG_PROP_INIT_POOL_SIZE) != null) {
                      initPoolSize = (Integer) poolConfig.get(CONFIG_PROP_INIT_POOL_SIZE);
                  }
                  if (poolConfig.get(CONFIG_PROP_MAX_POOL_SIZE) != null) {
                      maxPoolSize = (Integer) poolConfig.get(CONFIG_PROP_MAX_POOL_SIZE);
                  }
                  if (poolConfig.get(CONFIG_PROP_PREF_POOL_SIZE) != null) {
                      prefPoolSize = (Integer) poolConfig.get(CONFIG_PROP_PREF_POOL_SIZE);
                  }
  
                  if (poolConfig.get(CONFIG_PROP_POOL_TIME_OUT) != null) {
                      poolTimeOut = (Long) poolConfig.get(CONFIG_PROP_POOL_TIME_OUT);
  
                      /**
                       * The metatype is set to long for this property and all
                       * values will be passed as milliseconds.
                       * A value of 0 means no timeout, leave at 0
                       * Between 0 and 1000ms, round up to 1s
                       * Otherwise round to nearest second
                       */
                      if (poolTimeOut > 0 && poolTimeOut <= 1000) {
                          poolTimeOut = 1l; // override to 1 second
                      } else {
                          poolTimeOut = roundToSeconds(poolTimeOut);
                      }
                  }
                  if (poolConfig.get(CONFIG_PROP_POOL_WAIT_TIME) != null) {
                      poolWaitTime = (Long) poolConfig.get((CONFIG_PROP_POOL_WAIT_TIME));
                  }
              }
          }
  
          /*
           * Set the configuration on the ContextManager.
           */
          iContextManager.setContextPool(enableContextPool, initPoolSize, prefPoolSize, maxPoolSize, poolTimeOut, poolWaitTime);
  
          /*
           * Initialize the ContextManager.
           *
           * Only need to check for missing password as the configuration for LDAP would catch a missing
           * primary server. The password is optional and only required when the bind DN is configured.
           */
          InitializeResult result = iContextManager.initialize();
          if (result == InitializeResult.MISSING_PASSWORD) {
              String msg = Tr.formatMessage(tc, WIMMessageKey.MISSING_INI_PROPERTY, WIMMessageHelper.generateMsgParms(CONFIG_PROP_BIND_PASSWORD));
              throw new MissingInitPropertyException(WIMMessageKey.MISSING_INI_PROPERTY, msg);
          }
      }