@Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof ProviderPatientList)) return false;
    if (!super.equals(o)) return false;

    ProviderPatientList that = (ProviderPatientList) o;

    if (!id.equals(that.id)) return false;
    if (listName != null ? !listName.equals(that.listName) : that.listName != null) return false;
    if (listMembers != null ? !listMembers.equals(that.listMembers) : that.listMembers != null)
      return false;
    if (provider != null ? !provider.equals(that.provider) : that.provider != null) return false;
    return !(providerId != null ? !providerId.equals(that.providerId) : that.providerId != null);
  }
  /**
   * 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;
  }