@Override
  public void init(FilterConfig filterConfig) throws ServletException {
    String capsParam = filterConfig.getInitParameter(CAPABILITIES_PARAMETER);
    if (capsParam != null) {
      for (String nego : capsParam.trim().split(" *\\| *")) {
        try {
          caps |= Authn.Capabilities.class.getField(nego).getLong(null);
        } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException ex) {
          log.error("Error calculating authn capabilities while accessing constant  {}", nego);
        }
      }
    }

    AuthenticationProfileRepository.getInstance()
        .addObserver(
            new Observer() {
              @Override
              public void update(Observable o, Object arg) {
                cacheNegotiatingProfiles();
              }
            });
    cacheNegotiatingProfiles();
  }
  private synchronized void cacheNegotiatingProfiles() {
    schemes = new ArrayList<>();
    profiles = new ArrayList<>();

    for (AuthenticationProfile profile :
        AuthenticationProfileRepository.getInstance().getProfiles()) {
      ExtMap authnContext = profile.getAuthn().getContext();
      if ((authnContext.<Long>get(Authn.ContextKeys.CAPABILITIES).longValue() & caps) != 0) {
        profiles.add(profile);
        schemes.addAll(
            authnContext.<Collection<String>>get(
                Authn.ContextKeys.HTTP_AUTHENTICATION_SCHEME, Collections.<String>emptyList()));
      }
    }

    Collections.sort(
        profiles,
        new Comparator<AuthenticationProfile>() {
          @Override
          public int compare(AuthenticationProfile o1, AuthenticationProfile o2) {
            return Integer.compare(o1.getNegotiationPriority(), o2.getNegotiationPriority());
          }
        });
  }