public DefaultConfigStoreCachePolicy() {
      OptionsParameter param =
          OptionsManager.getInstance().getParameter(WS_CERT_RESOLVER_MAX_CACHE_SIZE);
      maxItems = OptionsParameter.getParamValueAsInteger(param, DEFAULT_WS_MAX_CAHCE_ITEMS);

      param = OptionsManager.getInstance().getParameter(WS_CERT_RESOLVER_CACHE_TTL);
      subjectTTL = OptionsParameter.getParamValueAsInteger(param, DEFAULT_WS_TTL);
    }
  /** {@inheritDoc} */
  @Override
  public void init() throws MessagingException {
    LOGGER.info("Initializing NHINDSecurityAndTrustMailet");

    super.init();

    // set the outbound policy for notifications if possible
    try {
      final boolean useOutboundPolicy =
          Boolean.parseBoolean(
              GatewayConfiguration.getConfigurationParam(
                  SecurityAndTrustMailetOptions.USE_OUTGOING_POLICY_FOR_INCOMING_NOTIFICATIONS,
                  this,
                  "false"));

      // we don't know if this parameter came from the mailet config or the options manager, so just
      // go ahead and set it at
      // the options manager level because that it where the agent reads the value... no danger that
      // we will overwrite the value that we want...
      // we would just be writing the same value if the information came from the options manager
      // module
      // the mailet parameter gets precedence, so we want to overwrite the options manager if the
      // value exists in the mailet configuration
      OptionsManager.getInstance()
          .setOptionsParameter(
              new OptionsParameter(
                  OptionsParameter.USE_OUTGOING_POLICY_FOR_INCOMING_NOTIFICATIONS,
                  Boolean.toString(useOutboundPolicy)));
    } catch (Exception e) {
      // log a warning that the parameter could not be set
    }

    // set the rejection policy for tampered routing headers
    try {
      final boolean rejectOnTamperPolicy =
          Boolean.parseBoolean(
              GatewayConfiguration.getConfigurationParam(
                  SecurityAndTrustMailetOptions.REJECT_ON_ROUTING_TAMPER, this, "false"));

      OptionsManager.getInstance()
          .setOptionsParameter(
              new OptionsParameter(
                  OptionsParameter.REJECT_ON_ROUTING_TAMPER,
                  Boolean.toString(rejectOnTamperPolicy)));
    } catch (Exception e) {
      // log a warning that the parameter could not be set
    }

    // set the JCE providers if available
    final String JCEName =
        GatewayConfiguration.getConfigurationParam(
            SecurityAndTrustMailetOptions.JCE_PROVIDER_NAME, this, "");
    if (!StringUtils.isEmpty(JCEName))
      OptionsManager.getInstance()
          .setOptionsParameter(new OptionsParameter(OptionsParameter.JCE_PROVIDER, JCEName));

    final String sensitiveJCEName =
        GatewayConfiguration.getConfigurationParam(
            SecurityAndTrustMailetOptions.JCE_SENTITIVE_PROVIDER, this, "");
    if (!StringUtils.isEmpty(sensitiveJCEName))
      OptionsManager.getInstance()
          .setOptionsParameter(
              new OptionsParameter(OptionsParameter.JCE_SENTITIVE_PROVIDER, sensitiveJCEName));

    // Get the configuration URL
    final String configURLParam = getInitParameter(SecurityAndTrustMailetOptions.CONFIG_URL_PARAM);

    if (StringUtils.isEmpty(configURLParam)) {
      LOGGER.error("NHINDSecurityAndTrustMailet Configuration URL cannot be empty or null.");
      throw new MessagingException(
          "NHINDSecurityAndTrustMailet Configuration URL cannot be empty or null.");
    }

    // parse into a URL and validate it is properly formed
    URL configURL = null;
    try {
      configURL = new URL(configURLParam);
    } catch (MalformedURLException ex) {
      LOGGER.error("Invalid configuration URL:" + ex.getMessage(), ex);
      throw new MessagingException(
          "NHINDSecurityAndTrustMailet Configuration URL cannot be empty or null.", ex);
    }

    final Collection<Module> modules = getInitModules();

    Provider<SmtpAgentConfig> configProvider;
    try {
      configProvider = this.getConfigProvider();

      if (configProvider == null) configProvider = createCompatConfigProvider(configURL);

      if (configProvider instanceof URLAccessedConfigProvider)
        ((URLAccessedConfigProvider) configProvider).setConfigURL(configURL);

      final Provider<ServiceSecurityManager> srvSecMgr = getServiceSecurityManagerProvider();
      if (configProvider instanceof SecureURLAccessedConfigProvider)
        ((SecureURLAccessedConfigProvider) configProvider).setServiceSecurityManager(srvSecMgr);

      final Provider<KeyStoreProtectionManager> keyStoreManagerProvider =
          getKeyStoreManagerProvider();
      if (configProvider instanceof KeyStoreProtectionConfigProvider
          && keyStoreManagerProvider != null)
        ((KeyStoreProtectionConfigProvider) configProvider)
            .setKeyStoreProtectionManger(keyStoreManagerProvider);

      agent = SmtpAgentFactory.createAgent(configURL, configProvider, null, modules);

    } catch (SmtpAgentException e) {
      LOGGER.error("Failed to create the SMTP agent: " + e.getMessage(), e);
      throw new MessagingException("Failed to create the SMTP agent: " + e.getMessage(), e);
    }

    // this should never happen because an exception should be thrown by Guice or one of the
    // providers, but check
    // just in case...
    /// CLOVER:OFF
    if (agent == null) {
      LOGGER.error("Failed to create the SMTP agent. Reason unknown.");
      throw new MessagingException("Failed to create the SMTP agent.  Reason unknown.");
    }
    /// CLOVER:ON

    // get the DSN creation options
    // default is RELIABLE_DSN_OPTION
    final String dnsCreateOptions =
        GatewayConfiguration.getConfigurationParam(
            SecurityAndTrustMailetOptions.AUTO_DSN_FAILURE_CREATION_PARAM,
            this,
            RELIABLE_DSN_OPTION);

    for (String dsnOption : dnsCreateOptions.split(",")) {
      if (dsnOption.equalsIgnoreCase(RELIABLE_DSN_OPTION)) autoDSNForTimelyAndReliable = true;
      else if (dsnOption.equalsIgnoreCase(GENERAL_DSN_OPTION)) autoDSNForGeneral = true;
    }

    // set the agent and config in the Gateway state
    final GatewayState gwState = GatewayState.getInstance();
    if (gwState.isAgentSettingManagerRunning()) gwState.stopAgentSettingsManager();

    gwState.setSmtpAgent(agent);
    gwState.setSmptAgentConfig(
        SmptAgentConfigFactory.createSmtpAgentConfig(configURL, configProvider, null));
    gwState.startAgentSettingsManager();

    LOGGER.info("NHINDSecurityAndTrustMailet initialization complete.");
  }