/**
   * Reads the properties file, and creates a dynamic security provider to register the SASL
   * implementations with.
   */
  public static ProviderRegistrationResult registerSaslProviders() {
    _logger.debug("public static void registerSaslProviders(): called");
    ProviderRegistrationResult result = ProviderRegistrationResult.FAILED;
    // Open the SASL properties file, using the default name is one is not specified.
    String filename = System.getProperty(FILE_PROPERTY);
    InputStream is =
        FileUtils.openFileOrDefaultResource(
            filename, DEFAULT_RESOURCE_NAME, DynamicSaslRegistrar.class.getClassLoader());

    try {
      Properties props = new Properties();
      props.load(is);

      _logger.debug("props = " + props);

      Map<String, Class<? extends SaslClientFactory>> factories = parseProperties(props);

      if (factories.size() > 0) {
        // Ensure we are used before the defaults
        JCAProvider qpidProvider = new JCAProvider(factories);
        if (Security.insertProviderAt(qpidProvider, 1) == -1) {
          Provider registeredProvider = findProvider(JCAProvider.QPID_CLIENT_SASL_PROVIDER_NAME);
          if (registeredProvider == null) {
            result = ProviderRegistrationResult.FAILED;
            _logger.error("Unable to load custom SASL providers.");
          } else if (registeredProvider.equals(qpidProvider)) {
            result = ProviderRegistrationResult.EQUAL_ALREADY_REGISTERED;
            _logger.debug("Custom SASL provider is already registered with equal properties.");
          } else {
            result = ProviderRegistrationResult.DIFFERENT_ALREADY_REGISTERED;
            _logger.warn("Custom SASL provider was already registered with different properties.");
            if (_logger.isDebugEnabled()) {
              _logger.debug(
                  "Custom SASL provider "
                      + registeredProvider
                      + " properties: "
                      + new HashMap<Object, Object>(registeredProvider));
            }
          }
        } else {
          result = ProviderRegistrationResult.SUCCEEDED;
          _logger.info("Additional SASL providers successfully registered.");
        }
      } else {
        result = ProviderRegistrationResult.NO_SASL_FACTORIES;
        _logger.warn("No additional SASL factories found to register.");
      }
    } catch (IOException e) {
      result = ProviderRegistrationResult.FAILED;
      _logger.error("Error reading properties: " + e, e);
    } finally {
      if (is != null) {
        try {
          is.close();

        } catch (IOException e) {
          _logger.error("Unable to close properties stream: " + e, e);
        }
      }
    }
    return result;
  }